我正在开发 NetSuite suitescript 自定义,并希望使用 Jest 编写测试。 由于 suitescript 与 Require JS 一起运行,我想知道如何根据需要正确模拟该函数。
源代码
/**
* @NApiVersion 2.1
* @NScriptType UserEventScript
*/
define([],() => {
const afterSubmit = (scriptContext) => {
try {
if(scriptContext.type === 'create'){
foo();
}
} catch (error) {
log.error('afterSubmit', error);
}
}
function foo(){
//do sth...
}
return {afterSubmit,
//Export for testing purpose
foo}
});
测试文件
import * as ueScript from 'the file path'
describe('Check run situation',()=>{
const MOCK_SCRIPT_CONTEXT = {};
it('Should call foo when type is create',()=>{
jest.spyOn(ueScript, 'foo');
MOCK_SCRIPT_CONTEXT.type = 'create';
ueScript.afterSubmit(MOCK_SCRIPT_CONTEXT);
expect(ueScript.updateAVTSByOperateType).toHaveBeenCalled();
});
});
我期望当 type = 'create' 时,应该调用 foo,但是测试结果是 foo 没有被调用。
我知道也许我没有正确地模拟实际调用的函数,但我不知道如何制作它。
我已经用关键字“同一模块中的笑话模拟函数”研究了这个主题,但尚未找到可行的方法。
对此有什么想法吗?
我在编写测试时遇到了同样的问题。我无法找出以这种方式测试助手执行的方法。我最终做的是编写测试来检查辅助函数内部的内容是否被执行。
例如。
/**
* @NApiVersion 2.1
* @NScriptType UserEventScript
*/
define(['N/record'],
/**
* @param{record} record
*/
(record) => {
/**
* Defines the function definition that is executed after record is submitted.
* @param {Object} scriptContext
* @param {Record} scriptContext.newRecord - New record
* @param {Record} scriptContext.oldRecord - Old record
* @param {string} scriptContext.type - Trigger type; use values from the context.UserEventType enum
* @since 2015.2
*/
const afterSubmit = (scriptContext) => {
if (scriptContext.type == 'create'){
foo();
}
}
/**
* Helper Function
*/
const foo = () => {
const recordInstance = record.create({
type: record.Type.INVENTORY_ITEM,
isDynamic: true
});
// Do more things
}
return {afterSubmit, foo}
});
测试
import testModule from 'SuiteScripts/testModule.js';
import record from 'N/record';
jest.mock('N/record');
let afterSubmitContext = {
newRecord: {},
oldRecord: {},
mode: ''
}
beforeEach(() => {
jest.clearAllMocks();
});
describe('testModule', () => {
test('Helper Function test', () => {
afterSubmitContext.type = 'create';
testModule.afterSubmit(afterSubmitContext);
expect(record.create).toHaveBeenCalledWith({
type: record.Type.INVENTORY_ITEM,
isDynamic: true
});
});
test('Helper function incorrect parameters', () => {
afterSubmitContext.type = 'not create';
testModule.afterSubmit(afterSubmitContext);
expect(record.create).not.toHaveBeenCalledWith({
type: record.Type.INVENTORY_ITEM,
isDynamic: true
});
})
});
我认为这不是编写测试的最佳方法,但这就是我现在正在做的事情,直到我弄清楚这个问题。
我仔细检查了调试器,根据它的说法,辅助函数“foo”是模块的一部分,并定义为模拟函数。我单步执行了它,它确实被触发了,但由于某种原因,它没有被注册为开玩笑的调用。这可能是 Oracle 方面的问题,我不确定。