【问题标题】:expect(jest.fn()).toHaveBeenCalled() fails even though the function has been called即使函数已被调用,expect(jest.fn()).toHaveBeenCalled() 也会失败
【发布时间】:2021-05-16 17:48:54
【问题描述】:

我正在尝试对返回承诺的函数进行单元测试。我在验证是否存在挑战 模拟函数被调用。这是我所做的。,

// codetotest.js
const { SomeModule, isSomething, isSomethingElse } = require("some-module");

exports.somefunction = (param1, param2)=> {
    const someModule = new SomeModule();

    someModule.someMethod("aaa", isSomething);
    someModule.someMethod("bbb", isSomethingElse);

    return (someModule.someOtherMethod(param1)
    .then(()=>{someModule.run(param2)}));
}

这是测试文件,测试表明未调用模拟函数,但我确实看到模拟函数中的控制台语句正在显示。

// codetotest.test.js
const { somefunction} = require("./codetotest.js");
const { SomeModule } = require("some-module");

jest.mock("some-module", () => {
    return {
        SomeModule: jest.fn().mockImplementation(() => {
            return {
                someMethod: jest.fn((param, fn) => { console.log("This prints!"); }),
                someOtherMethod: jest.fn((param) => { return Promise.resolve(() => { }) }),
                run: jest.fn((param) => { return Promise.resolve(() => { return []; }) })
            }
        })
    };
});

afterEach(() => {
    jest.resetAllMocks();
    jest.restoreAllMocks();
});

describe("Test codetotest.js", () => {
    it("somefunction() - success", async () => {
        const someModule = new SomeModule();

        let output = await somefunction("param1", "param2");

        expect(SomeModule).toHaveBeenCalled();
        expect(someModule.someMethod).toHaveBeenCalled(); // This fails

        await expect(someModule.someOtherMethod.mock.results[0]).resolves;
        expect(someModule.someOtherMethod).toHaveBeenCalled(); // This fails

        await expect(someModule.run.mocks.results[0]).resolves;
        expect(someModule.run).toHaveBeenCalled(); // This fails
    });
});

感谢任何帮助/指针。

谢谢。

P.S:在 nodeJs 开发和单元测试方面,我还是个初学者。

【问题讨论】:

    标签: node.js unit-testing jestjs


    【解决方案1】:

    我在这上面花了很长时间,最后发现实例化的模拟类没有正确返回模拟的方法。 This 的回答提示了我哪里出错了。

    因此,我不得不按如下方式更改我的测试文件。,

    // codetotest.test.js
    const { somefunction} = require("./codetotest.js");
    const { SomeModule } = require("some-module");
    
    jest.mock("some-module", function() {
        return {
            SomeModule: jest.fn().mockImplementation(function() { // Arrow function cannot be used as constructor
                // Because I was not using the 'this' operator, my constructor always returned empty
                this.someMethod = jest.fn((param, fn) => { console.log("This prints!"); });
                this.someOtherMethod = jest.fn((param) => { return Promise.resolve(() => { }) });
                this.run = jest.fn((param) => { return Promise.resolve(() => { return []; }) });
                return {
                    someMethod: this,someMethod,
                    someOtherMethod: this.someOtherMethod,
                    run: this.run
                }
            })
        };
    });
    
    afterEach(() => {
        jest.restoreAllMocks();
    });
    
    describe("Test codetotest.js", () => {
        it("somefunction() - success", async () => {
            await somefunction("param1", "param2");
    
            expect(SomeModule).toHaveBeenCalled();
            expect(SomeModule.mock.instances[0].someMethod).toHaveBeenCalled(); // This works
            expect(SomeModule.mock.instances[0].someOtherMethod).toHaveBeenCalled(); // This works
            expect(someModule.mock.instances[0].run).toHaveBeenCalled(); // This works
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 2017-10-20
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多