Несколько ручных макетов модулей CommonJS с помощью Jest

Я видел документацию для макетов Jest, используя папку mocks, но я хочу иметь возможность имитировать модуль с одним макетом в одном тесте и имитировать тот же модуль с другим макетом в другом тесте.

Например, с 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? Разница в том, что я определяю макет внутри теста, а не в какой-то внешней папке, которая используется для всех тестов.


person Evan Layman    schedule 20.02.2015    source источник


Ответы (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");
    });
});
person ncuillery    schedule 26.02.2015
comment
Обратите внимание, что шаблон сильно уменьшен шуткой :) - person ncuillery; 26.02.2015
comment
Спасибо, это имеет большой смысл! - person Evan Layman; 26.02.2015
comment
Начиная с Jest 15 , теперь вам нужно явно имитировать модуль. Добавьте `jest.mock('moduleToMock') перед тем, как это потребуется. - person Greg McGuffey; 06.12.2017