需要 JS 和 jest 来模拟同一模块中的函数

问题描述 投票:0回答:1

我正在开发 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 没有被调用。

我知道也许我没有正确地模拟实际调用的函数,但我不知道如何制作它。

我已经用关键字“同一模块中的笑话模拟函数”研究了这个主题,但尚未找到可行的方法。

对此有什么想法吗?

jestjs requirejs suitescript suitescript2.0
1个回答
0
投票

我在编写测试时遇到了同样的问题。我无法找出以这种方式测试助手执行的方法。我最终做的是编写测试来检查辅助函数内部的内容是否被执行。

例如。

/**
 * @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 方面的问题,我不确定。

© www.soinside.com 2019 - 2024. All rights reserved.