解決策は、モック化された関数をサブ コンポーネントに直接渡してテストすることです。複数の「サブコンポーネント」を含むものは、通常、複数の機能ユニットをテストしているため、真の単体テストではありません。
だから私は作成しますMemberList-test.js
:
describe('MemberList', function () {
it('calls the add handler when add is clicked', function () {
var Component = TestUtils.renderIntoDocument(
<MemberList add={ jest.genMockFn() } />
);
const btn = TestUtils.findRenderedDOMComponentWithTag(Component, 'span')
TestUtils.Simulate.change(btn);
expect(Component.add.mock.calls.length).toBe(1)
})
})
次に、作成する必要がある同じテスト内でメンバー コンポーネントを直接テストするのではなく、次のようにしますMember-test.js
。
describe('Member', function () {
it('calls the add handler when add is clicked', function () {
var Component = TestUtils.renderIntoDocument(
<Member remove={ jest.genMockFn() } />
);
const btn = TestUtils.findRenderedDOMComponentWithTag(Component,
'HOWEVER YOU FIND YOUR REMOVE BUTTON')
TestUtils.Simulate.change(btn);
expect(Component.remove.mock.calls.length).toBe(1)
})
})
欠けているアサーションは、メンバー リストに渡された削除ハンドラーがメンバー コンポーネントに正しく渡されているということです。では、別のテストをMemberList-test.js
it('passes correct information to the children', function () {
var MemberMock = require('../Member')
var removeFn = jest.genMockFn();
var testMember = {WHATEVER YOUR MEMBER OBJECT LOOKS LIKE}
var Component = TestUtils.renderIntoDocument(
<MemberList members={ [testMember] }
remove={ removeFn } />
);
// We expect the member component to be instantiated 1 time and
// passed the remove function we defined
// as well as a key and the data
expect(MemberMock.mock.calls).toEqual([[{key: 0, data: testMember,
remove: removeFn}]])
})
次に、フォーム コンポーネントで同じパターンを実行するだけです。メンバー リストとボタンをモックし、それらを個別にテストして、正しいハンドラーとデータが渡されることを確認します。
うまくいけば、これが理にかなっており、返信だけでなくても、Skype などで説明できるかもしれません。