使用 Jest 的 CommonJS 模块的多个手动模拟
Multiple Manual Mocks of CommonJS Modules with Jest
我看到了使用 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 有关吗?不同之处在于我在测试中定义模拟,而不是在用于所有测试的某个外部文件夹中。
是的,您的模拟将如下所示:
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");
});
});
我看到了使用 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 有关吗?不同之处在于我在测试中定义模拟,而不是在用于所有测试的某个外部文件夹中。
是的,您的模拟将如下所示:
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");
});
});