ここでは、Mocha/Chaiで書いたテストスタブを示します。私はアクションを簡単に送信でき、状態は私が期待しているものと同等であると主張しますが、途中で期待されるプロセス(IEの以前のテスト)に従ったことをどのように検証しますか?redux-thunkを使用するreduxアプリケーションを単体テストする方法
/**
* This test describes the INITIALIZE_STATE action.
* The action is asynchronous using the async/await pattern to query
* The database. The action creator returns a thunk which should in turn
* return the new state with a list of tables and their relationships with eachother
**/
describe('Initialize state',() => {
it('Should check if state is empty',() => {});
it('Should check if tables/relationships exist',() => {});
it('Should check if new tables have been added',() => {});
it('Should merge new and existing tables and relationships',() => {
// Here is where we would dispatch the INITIALIZE_STATE
// action and assert that the new state is what I expect it to be.
});
});
実際のアクション自体のコードはまだ書かれていません。これらの検証にコードを渡したいからです。いくつかの擬似コードはこのように見えるかもしれません。
export function initializeState() {
return function(dispatch) {
let empty = store.getState().empty
let state = (empty) ? await getLastPersistedState() : store.getState()
let tables = state.tables;
let payload = tables.concat(await getNewTables(tables));
dispatch({type: 'INITIALIZE_STATE', payload});
}
}
function getLastPerisistedState() {
return mongodb.findall(state, (s) => s);
}
function getNewTables(tableFilter) {
return sql.query("select table_name from tables where table_name not in (" + tableFilter + ")");
}
実際のmongo/SQL関数を呼び出したいのですか?私の標準的なアプローチは、テストを必要としないように非同期のもの(ここではサンク)を短くし、その周りのすべてをテストすることです。 'INITIALIZE_STATE'アクションを模擬ペイロードでテストしてください。 – nrabinowitz