【问题标题】:Multiple Manual Mocks of CommonJS Modules with Jest使用 Jest 手动模拟多个 CommonJS 模块
【发布时间】:2015-04-22 18:18:04
【问题描述】:

我看到了使用 mocks 文件夹的 Jest 模拟的文档,但我希望能够在一个测试中用一个模拟模拟一个模块,并在另一个测试中用另一个模拟模拟同一个模块。

例如,使用 rewire 和 jasmine,您可以执行以下操作:

//module2.js
module.exports = {
    callFoo: function () {
        require('moduleToMock').foo();
    }
};

//module2Test.js
describe("test1", function () {
    var mock;
    beforeEach(function () {
        var rewire = require('rewire');
        mock = jasmine.createSpyObj('mock', ['foo']);
    });
    it("should be mocked with type1", function () {
        mock.foo.and.returnValue("type1");
        rewire('moduleToMock', mock);
        var moduleUsingMockModule = require('module2');
        expect(moduleUsingMockModule.callFoo()).toEqual("type1");
    });
});
describe("test2", function () {
    it("should be mocked with type2", function () {
        mock.foo.and.returnValue("type2");
        rewire('moduleToMock', mock);
        var moduleUsingMockModule = require('module2');
        expect(moduleUsingMockModule.callFoo()).toEqual("type2");
    });
});

这可能与 Jest 有关吗?不同之处在于我在测试中定义了模拟,而不是在用于所有测试的某个外部文件夹中。

【问题讨论】:

    标签: unit-testing mocking jestjs


    【解决方案1】:

    是的,您的模拟将如下所示:

    module.exports = {
        foo: jest.genMockFunction();
    }
    

    然后您将能够在测试用例中配置自定义行为:

    var moduleToMock = require('moduleToMock');
    
    describe('...', function() {
        it('... 1', function() {
            moduleToMock.foo.mockReturnValue('type1')
    
            expect(moduleToMock.foo).toBeCalled();
            expect(moduleUsingMockModule.callFoo()).toEqual("type1");
        });
    
        it('... 2', function() {
            moduleToMock.foo.mockReturnValue('type2')
    
            expect(moduleToMock.foo).toBeCalled();
            expect(moduleUsingMockModule.callFoo()).toEqual("type2");
        });
    });
    

    【讨论】:

    • 请注意,样板是用玩笑强烈减少的:)
    • 谢谢,这很有意义!
    • Jest 15 开始,您现在还需要显式模拟该模块。在需要它之前添加 `jest.mock('moduleToMock')。
    猜你喜欢
    • 2019-06-09
    • 2019-12-08
    • 2019-08-17
    • 2021-03-14
    • 2018-09-16
    • 2021-02-04
    • 1970-01-01
    • 2016-05-20
    相关资源
    最近更新 更多