2017-07-28 23 views
0

這裏是一個廣義的例子:如何在一個笑話測試中檢查一個thunk動作創建者內的thunk動作是否已經發出?

// myActions.js 
export const actionOne =() => (dispatch) => { 
    dispatch(actionTwo()); 
}; 

export const actionTwo =() => ({ 
    type: 'SOME_TYPE', 
}); 

我想測試actionTwo已要麼調用或布控,最理想的情況是測試知道什麼是actionTwo回事什麼,因爲我有一個不同的測試那需要照顧。

我使用redux-mock-store派遣測試行動的嘲笑存儲和調用store.getActions(),以找出是否在thunk行動的創建者中預期的動作已經出動。我覺得在這個特定的場景中這不是正確的方法,因爲那樣測試會比測試更多地進行測試。我真的只想知道是否已經調用了actionTwo

我知道spyOnjest.mock,但我一直無法使用任何一個來解決我的問題。以下是廣義測試的樣子:

// myActions.test.js 
import configureMockStore from 'redux-mock-store'; 
import thunk from 'redux-thunk'; 
import * as actions from 'myActions'; 

const mockStore = configureMockStore([thunk]); 

test('actionOne',() => { 
    const store = mockStore(); 

    return store.dispatch(actions.actionOne()).then(() => { 
     // TODO: check if actions.actionTwo was called 
    }); 
}); 

test('actionTwo',() => { 
    const store = mockStore(); 

    return store.dispatch(actions.actionTwo()).then(() => { 
     expect(store.getActions()).toEqual([{ type: 'SOME_TYPE' }]); 
    }); 
}); 

我很感激任何建議!

回答

1

花了我一段時間,但我想通了。這並不理想(因爲它涉及到對測試代碼的小改動),但是我可以得到最接近理想的結果。

// myActions.js 
export const actionOne =() => (dispatch) => { 
    dispatch(exports.actionTwo()); 
}; 

export const actionTwo =() => ({ 
    type: 'SOME_TYPE', 
}); 

最重要的變化是exports.actionTwo()。這樣,我確信我可以從外部覆蓋函數的實現(測試文件),覆蓋函數實際上將從導入的文件中調用。

現在,我可以簡單地添加類似下面的我的測試文件:

beforeEach(() => { 
    actions.actionTwo = jest.fn(() =>() => Promise.resolve()); 
}); 

actionTwo現在被嘲笑,我可以用它toBeCalledWith和其他方面的期望。

const actionTwo = actions.actionTwo; 

然後在測試設置其執行情況,我可以覆蓋:如果我想在相同的測試文件中檢驗其實際執行情況,我可以在一個變量調用beforeEach,像以前一樣存儲模擬呼叫

actions.actionTwo = actionTwo; 

就是這樣。現在我可以確保忽略導出函數的所有副作用並將其作爲實際單位進行測試。

0

最好斷言兩個還原動作命中商店,而不是actionOne調用動作創建者。

由於所有分派到商店的操作都必須採取措施type。只是作出斷言store.getActions()

test('actionOne',() => { 
    const store = mockStore(); 
    return store.dispatch(actions.actionOne()).then(() => { 
     expect(store.getActions()).to.have.length(2); 
     expect(store.getActions()[0].type).to.equal('ACTION_ONE_TYPE'); 
     // make additional assertions about the first action 

     expect(store.getActions()[1].type).to.equal('ACTION_TWO_TYPE'); 
    }); 
}); 
+0

感謝您的回覆,但我不相信這是正確的方式。想象一下'actionTwo'不是一個簡單的動作創造者,而是一個thunk,可能甚至有條件地調度自己的行爲。我不想在'actionOne'的測試中知道任何邏輯,我只是​​想確保'actionTwo'完全被調用,甚至只是調用該函數。有沒有簡單的方法來實現這一目標? –

+0

同意。我不想測試這個動作的執行情況(它在別處測試過),我只是想測試它被調用。 – Matthew

相關問題