[英]React and jest mock module
我正在創建一個應用程序,在其中我使用redux和node-fetch進行遠程數據獲取。
我想測試一個事實,那就是我很好地調用了具有良好參數的fetch函數。
這樣,我正在使用jest.mock和jasmine.createSpy方法:
it('should have called the fetch method with URL constant', () => {
const spy = jasmine.createSpy('nodeFetch');
spy.and.callFake(() => new Promise(resolve => resolve('null')));
const mock = jest.mock('node-fetch', spy);
const slug = 'slug';
actionHandler[FETCH_REMOTE](slug);
expect(spy).toHaveBeenCalledWith(Constants.URL + slug);
});
這是我要測試的功能:
[FETCH_REMOTE]: slug => {
return async dispatch => {
dispatch(loading());
console.log(fetch()); // Displays the default fetch promise result
await fetch(Constants.URL + slug);
addLocal();
};
}
如您所見,我正在嘗試記錄console.log(fetch())行為,並且我具有默認承諾來解決node-fetch給定的問題,而不是我用Jest模擬並用jasmine監視的行為。
您有什么不知道的主意嗎?
編輯:我的測試向我顯示了一個錯誤,例如從未調用過我的間諜
您的動作處理程序實際上是一個動作處理程序工廠。 在actionHandler[FETCH_REMOTE]
,您正在創建一個新函數。 返回的函數將任務dispatch
為參數並調用您顯示的代碼。
這意味着您的測試代碼將永遠不會調用間諜程序上的任何函數,因為永遠不會調用創建的函數。
我認為您將需要創建一個模擬dispatch
功能並執行以下操作:
let dispatchMock = jest.fn(); // create a mock function
actionHandler[FETCH_REMOTE](slug)(dispatchMock);
編輯:
對我來說,您的actionHandler
看起來更像是actionCreator
,通常用redux術語來稱呼,盡管我個人更喜歡將它們actionFactories
因為這就是它們:創建動作的工廠。
當你正在使用thunks
(?)你actionCreater
(這是誤導命名actionHandler
)不直接創建一個action
,但它一旦動作被分派調用另一個函數。 為了進行比較,常規的actionCreator如下所示:
updateFilter: (filter) => ({type: actionNames.UPDATE_FILTER, payload: {filter: filter}}),
另一方面, actionHandler
對要分派的動作做出反應並評估其有效負載。
在您的情況下,這就是我要做的:
創建一個名為actionFactories
的新對象,如下所示:
const actionFactories = {
fetchRemote(slug): (slug) => {
return async dispatch => {
dispatch(loading());
console.log(fetch()); // Displays the default fetch promise result
let response = await fetch(Constants.URL + slug);
var responseAction;
if (/* determine success of response */) {
responseAction = actionFactories.fetchSuccessful(response);
} else {
responseAction = actionFactories.fetchFailed();
}
dispatch(responseAction);
};
}
fetchFailed(): () => ({type: FETCH_FAILED, }),
fetchSuccessful(response): () => ({type: FETCH_FAILED, payload: response })
};
為FETCH_FAILED
和FETCH_SUCCESSFUL
創建一個actionHandler,以根據響應更新商店。
順便說一句:您的console.log
語句對我也沒有多大意義,因為fetch
只是返回一個承諾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.