2017-01-13 6 views
4

酵素を使用して、モカとアサートを期待します。Reduxユニットテストでストアを更新するには?

私のユニットテストの目的は、一時停止し、mergePropsで一時停止していないときに正しい引数を使って呼び出されるディスパッチをチェックすることです。 私の店舗の状態を動的に変更する必要があります:paused: true。私が試してみて、派遣で一時停止値を更新したが、私はそれだけでモックだと決して実際に減速機を通るので、これが正しいとは思わない瞬間

私はパッケージredux-mock-storeを使用しています。

どうすればよいですか?

describe('Play Container',() => { 
    const id = 'audio-player-1'; 

    const store = configureMockStore()({ 
    players: { 
     'audio-player-1': { paused: false } 
    } 
    }); 
    let dispatchSpy; 
    let wrapper; 

    beforeEach(() => { 
    dispatchSpy = expect.spyOn(store, 'dispatch'); 
    wrapper = shallow(
     <PlayContainer className={attributes.className}> 
     {children} 
     </PlayContainer>, 
     { context: { id } }, 
    ).shallow({ context: { store } }); 
    }); 

    it('onClick toggles play if paused',() => { 
    //Not Working 
    store.dispatch(updateOption('paused', true, id)); 
    wrapper.simulate('click'); 
    expect(dispatchSpy).toHaveBeenCalledWith(play(id)); 
    }); 

    it('onClick toggles pause if playing',() => { 
    wrapper.simulate('click'); 
    expect(dispatchSpy).toHaveBeenCalledWith(pause(id)); 
    }); 
}); 

容器:

const mapStateToProps = ({ players }, { id }) => ({ 
    paused: players[id].paused 
}); 

const mergeProps = (stateProps, { dispatch }, { id }) => ({ 
    onClick:() => (stateProps.paused ? dispatch(play(id)) : dispatch(pause(id))) 
}); 

export default connectWithId(mapStateToProps, null, mergeProps)(Play); 

connectWithId:

//getContext() is from recompose library and just injects id into props 
export const connectWithId = (...args) => compose(
    getContext({ id: React.PropTypes.string }), 
    connect(...args), 
); 

アクション:

updateOption: (key, value, id) => ({ 
    type: actionTypes.player.UPDATE_OPTION, 
    key, 
    value, 
    id, 
}), 
+1

を報告します、あなたは、このリンクを見たことがありますか? http://redux.js.org/docs/recipes/WritingTests.html – denvaar

+0

私は上記の文書を読むことをお勧めします。アクション、レデューサー、コンポーネントの3つの異なるものを別々にテストする必要があります。アクション(実際にアクションクリエイター)をテストするときは、ディスパッチされた実際のアクションが正しく形成されていることを確認したいだけです。減速機をテストするときは、すでに行っているように店舗を模擬し、何らかのアクションを送り、新しい状態が返ってくることを期待してください。コンポーネントをテストするときは、実際に動作をテストしたい(つまり、ここをクリックするとディスパッチが呼び出されます)、もちろんディスパッチを嘲笑します。 –

答えて

2

configureMockStoreミドルウェアを適用することにより、模擬店を構成するために使用される、工場であります。 mockStoreオブジェクトを返します。
mockStoreは、コンフィグレーションされたモックストアのインスタンスを返します。行動を通じて状態を変えることはありません。それは単にアクションが渡されたレコードです。その理由は、ユニットテストを作成するユーティリティツールであり、 "統合"(状態+コンポーネント)テストではないからです。

それでもあなたは状態変化をシミュレートすることができます。あなたは次の操作を行うことができるようにmockStoreは、機能を受け入れる:

import configureMockStore from 'redux-mock-store'; 

const middlewares = []; 
const mockStore = configureMockStore(middlewares); 

let state = { 
    players: { 
    'audio-player-1': { paused: false } 
    } 
}; 

const store = mockStore(() => state); 

次に、あなたのテストで、あなたが行うことができます:

state = NEW_STATE; 

// now you need to make the components update the state. 
// so you can dispatch any action so the mock store will notify the subscribers 
store.dispatch({ type: 'ANY_ACTION' }); 
-1

pr by @catarinasoliveiraのおかげで、あなたの本当の減速を提供できるようになりましたようですそれに応じてストアを更新します。それはマスターでありますが、それは、NPMにだ場合、私は知らない、まだ、または率直に言って、それは私がちょうど言ったことをしなければ、私はそれを試してみることを約だと

関連する問題