Jestを使ってcomponentDidMountのメソッド呼び出しを監視する
最近、ReactコンポーネントのcomponentDidMount
メソッドで、あるカスタムメソッドが条件付きで呼ばれることをテストしたいと思いました。
componentDidMount() {
if (this.props.initOpen) {
this.methodName();
}
}
私はテストフレームワークとしてJestを使用しており、モック/スパイのための jest.fn()
が含まれています。 以下のようにすれば、Sinonでもかなり簡単にテストできると読みました。
sinon.spy(Component.prototype, "methodName");
const wrapper = mount(<Component {...props} />);
expect(wrapper.instance().methodName).toHaveBeenCalled();
これをJestで以下のように再現しようとしています。
Component.prototype.methodName = jest.fn();
const wrapper = mount(<Component {...props} />);
expect(wrapper.instance().methodName).toHaveBeenCalled();
このコードは失敗し、以下のようなエラーが発生します。
jest.fn() value must be a mock function or spy.
Received:
function: [Function bound mockConstructor]
この機能をJestでテストすることは可能でしょうか?もし可能ならば、どのようにして?
37
2
鍵となるのはjestsの
spyOn
メソッドを使うことです。以下のようになるはずです。ここにあるように 例:https://stackoverflow.com/questions/40393486/test-if-function-is-called-react-and-enzyme
注意 テストを実行するたびに、スパイされた関数をクリアすることも最善の方法です。
https://facebook.github.io/jest/docs/en/jest-object.html#jestclearallmocks
遅くなりましたが、これを見て、
componentDidMount
がネストされたメソッドへの呼び出しを開始することをテストするためには、次のようなテストを行うことを提案します。Module (モジュール)
テスト - 良好
componentDidMount
を呼び出した場合、
methodNameが
componentDidMount`を介して呼び出されたというアサーションがより有効になります。テスト - 悪い。
このようにテストを書くことで、メソッドを呼び出し、それが呼び出されたことをアサートします。もちろん、メソッドを呼び出しただけなので、呼び出されたことになります。