2017-07-17 34 views
0

我目前正在用Jest對我的一個反應服務(使用redux-saga)進行單元測試。這些服務調用API,選擇器和其他API以外的操作,選擇器和特定於此服務的操作。單元測試與Jest的反應:如何模擬不同功能的動作?

因此嘲笑這些外部API,選擇和行動,我曾經開玩笑地嘲笑他們在我的測試文件是這樣的:

// API mock example 
jest.mock('../otherFeatureService/api'),() => { 
    return { myApi: jest.fn() }; 
} 

// reducer mock example 
jest.mock('../otherFeatureService/reducer'),() => { 
    return { isConnected: (fake) => jest.fn(fake) }; 
} 

// API action example 
jest.mock('../otherFeatureService/actions'),() => { 
    return { myAction:() => jest.fn() }; 
} 

一切正常,在我的測試中,除了模擬操作。 不過,我得到了下面的消息時,我想我預期的結果與一個我得到了我的模擬動作比較:

expect(received).toEqual(expected) 

Expected value to equal: 
    {"@@redux-saga/IO": true, "PUT": {"action": [Function mockConstructor], "channel": null}} 
Received: 
    {"@@redux-saga/IO": true, "PUT": {"action": [Function mockConstructor], "channel": null}} 

Difference: 

Compared values have no visual difference. 

你想過它爲什麼不採取行動只能工作任何想法? (我正在使用'redux-saga-testing'的sagaHelper進行測試)

謝謝。 printfx000。

+0

一般來說,ES功能永遠不會相等,即使它們具有相等的代碼和名稱。在你的情況下,action實際上並沒有被調用,所以也許在測試的某個地方,你直接傳遞action函數,但是必須傳遞它的結果,這是一個普通的可序列化的對象。 –

回答

0

您遇到此問題是因爲jest無法區分2個匿名函數。 爲了解決這個問題,你需要爲你提供一個命名函數來模擬。 因爲歡笑提升模擬聲明,您需要在內聲明您的命名函數您的模擬。

jest.mock('../selectors',() => { 

    function mockedMakeSelectCoverageResult() {} 

    return ({ 
     makeSelectCoverageResult:() => mockedMakeSelectCoverageResult, 
    }); 

}); 

expect(descriptor).toEqual(select(makeSelectCoverageResult())); 
相關問題