2017-07-10 131 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()'。也不需要「導入」模塊。 –