2017-07-10 133 views
2

我很困惑在Jest中嘲笑如何单元测试的实现。事情是我想嘲笑不同的预期行为。Jest模拟模块每测试

有什么办法可以达到这个目的吗?因为导入只能在文件的顶部,并且能够模拟一些必须在导入之前声明的内容。我也尝试过传递一个本地函数,这样我就可以覆盖这个行为,但是开玩笑地抱怨你不允许本地传递任何东西。

jest.mock('the-package-to-mock',() => ({ 
    methodToMock: jest.fn(() => console.log('Hello')) 
})); 

import * as theThingToTest from '../../../app/actions/toTest' 
import * as types from '../../../app/actions/types' 

it('test1',() => { 
    expect(theThingToTest.someAction().type).toBe(types.SOME_TYPE) 
}) 

it('test2',() => { 
    //the-package-to-mock.methodToMock should behave like something else 
    expect(theThingToTest.someAction().type).toBe(types.SOME_TYPE) 
}) 

内部,你可以想像theThingToTest.someAction()使用the-package-to-mock.methodToMock

回答

10

您可以用间谍嘲笑并导入嘲笑模块。在您的测试设置模拟该如何做使用mockImplementation

jest.mock('the-package-to-mock',() => ({ 
    methodToMock: jest.fn() 
})); 
import {methodToMock} from 'the-package-to-mock' 

it('test1',() => { 
    methodToMock.mockImplementation(() => 'someValue') 
}) 

it('test2',() => { 
    methodToMock.mockImplementation(() => 'anotherValue') 
}) 
+0

感谢很多答案,它就像一个魅力:) – Kanekotic

+0

如果什么'methodToMock'是一个不变的性质呢? – alayor

+0

为什么你需要嘲笑一个恒定的价值。无论如何,只要用值替换'jest.fn()'。也不需要“导入”模块。 –