4

我使用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有关吗?不同之处在于我在测试中定义了模拟,而不是在用于所有测试的某个外部文件夹中。

4

1 回答 1

2

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

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");
    });
});
于 2015-02-26T10:35:59.957 回答