2015-02-20 3 views
2

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

Например, с ReWire и жасмин, вы могли бы сделать что-то вроде этого:

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

ответ

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"); 
    }); 
}); 
+0

Обратите внимание, что шаблонный сильно уменьшаются с шуткой :) – ncuillery

+0

Спасибо, это имеет большой смысл! –

+0

Начиная с [Jest 15] (https://facebook.github.io/jest/blog/2016/09/01/jest-15.html#disabled-automocking), вам также необходимо явно высмеять модуль. Добавьте 'jest.mock ('moduleToMock') перед его применением. –