2017-08-18 157 views
7

我有一個這樣的模擬模塊中的我的組件測試文件如何在每個測試中更改jest模擬函數返回值?

jest.mock('../../../magic/index',() => ({ 
    navigationEnabled:() => true, 
    guidanceEnabled:() => true 
    })); 

這些功能將被稱爲呈現我的組件隱藏和顯示一些特定功能的功能。

我想爲這些模擬函數的返回值的不同組合拍攝快照。

爲假設我有一個測試用例這樣

it('RowListItem should not render navigation and guidance options',() => { 
    const wrapper = shallow(
     <RowListItem type="regularList" {...props} /> 
    ); 
    expect(enzymeToJson(wrapper)).toMatchSnapshot(); 
    }); 

這種運行測試用例我想改變模擬模塊,因爲我是函數返回值false這樣的動態

jest.mock('../../../magic/index',() => ({ 
    navigationEnabled:() => false, 
    guidanceEnabled:() => false 
    })); 

導入RowListItem組件已經一次,所以我的模擬模塊不會再次導入。所以它不會改變。我該如何解決這個問題?

回答

8

您可以模擬模塊,使返回間諜並將其導入到你的測試:

import {navigationEnabled, guidanceEnabled} from '../../../magic/index' 

jest.mock('../../../magic/index',() => ({ 
    navigationEnabled: jest.fn(), 
    guidanceEnabled: jest.fn() 
})); 

那麼以後你可以改變使用mockImplementation

navigationEnabled.mockImplementation(()=> true) 
//or 
navigationEnabled.mockReturnValueOnce(true); 

實際執行,並在接下來的測試

navigationEnabled.mockImplementation(()=> false) 
//or 
navigationEnabled.mockReturnValueOnce(false); 
2

你想要做的是

import { navigationEnabled, guidanceEnabled } from '../../../magic/index'; 

jest.mock('../../../magic/index',() => ({ 
    navigationEnabled: jest.fn(), 
    guidanceEnabled: jest.fn() 
})); 

descrive('test suite',() => { 
    it('every test',() => { 
    navigationEnabled.mockReturnValueOnce(value); 
    guidanceEnabled.mockReturnValueOnce(value); 
    }); 
}); 

你可以看看更多有關這些功能在這裏=>https://facebook.github.io/jest/docs/mock-functions.html#mock-return-values