テストとReact Reduxの新機能で、ここでいくつかの問題が混在する可能性があります。私は1つの例しか提示しませんが、私はmount()
,shallow()
,instance()
,stub
,spy
などの多くの異なる組み合わせを試みました。私はsetFooData()
が呼ばれる条件の周りにいくつかのテスト、componentDidMount()
とcomponentWillReceiveProps()
などのライフサイクルメソッドで、すなわち条件を書きたいSinonスタブインスタンスメソッドがmapDispatchToPropsで宣言されました
const mapDispatchToProps = (dispatch, props) => ({
setFooData(fooId, data) {
dispatch(Actions.setFooData(fooId, data));
},
});
...
return (
<div fooId={this.props.fooId}>
<Foo {...fooProps}/>
</div>
);
:
は、コンポーネント、setFooData()
アップデートReduxの状態とFoo.props.data
を考えます。
setFooData()
は、サーバー呼び出しなどを含むので、これらのテストは、単にビュー層とどのコンポーネントがFoo.props.data
がsetFooData()
によって最終的に設定された結果としてレンダリングに関係するので、setFooData()
はstub
のための良い候補のように思えます。
したがって、mount()
ではなく、酵素shallow()
が適切であると思われますか?私はstub
setFooData()
にしてみてくださいどのような場合では、:wrapper.instance()
はsetFooData()
が実際に定義されていないオブジェクトを生成し、検査の際
Attempted to wrap undefined property setFooData as function
が、他によると:
let wrapper = return shallow(<Foo {...props}/>);
let stub = sinon.stub(wrapper.instance(), 'setFooData');
私はエラーが表示されます例、私はそれがすべきだと思います。
さらに、setFooData()
はwrapper.instance().selector.props
上に存在する、及びlet stub = sinon.stub(wrapper.instance().selector.props, 'setFooData');
私はオブジェクトsetFooData() =/= stub
を検査する場合、エラーを回避し、機能をテストごとに呼び出されていない状態。
私が代わりにmount()
を使用し、
let wrapper = mount(<Provider store={store}><Foo {...props}/></Provider>);
let componentDidMountSpy = sinon.spy(Foo.prototype, 'componentDidMount');
let componentWillReceivePropsSpy = sinon.spy(Foo.prototype, 'componentWillReceiveProps');
expect(componentDidMountSpy.called).to.be.true; //passes
expect(componentWillReceivePropsSpy.called).to.be.true; //passes
expect(stub.called).to.be.true; //fails
私はsetFooData()
の身体に関連する表示された別のエラーが発生するので、setFooData()
が呼ばれたが、関数が実際に実行されることから、その本当の体を防ぐために、スタブされていません。
ご理解いただきありがとうございます。