React Enzymeで第2番目(またはn番目)のノードを見つける方法:初心者向けチュートリアル
React Enzymeで第2番目(またはn番目)のノードを見つける方法
このチュートリアルでは、React EnzymeとJasmineを使用して、Reactコンポーネントの第2番目(またはn番目)のノードを見つける方法を説明します。
例
次の例では、MyComponent
コンポーネントの第2番目の子要素を見つけます。
import React from 'react';
import { mount } from 'enzyme';
import jasmine from 'jasmine';
const MyComponent = () => (
<div>
<p>First child</p>
<p>Second child</p>
<p>Third child</p>
</div>
);
describe('MyComponent', () => {
it('should find the second child', () => {
const wrapper = mount(<MyComponent />);
const secondChild = wrapper.find('p').at(1);
expect(secondChild.text()).toEqual('Second child');
});
});
このコードは、次のようになります。
mount
関数を使用して、MyComponent
コンポーネントをマウントします。find
メソッドを使用して、p
要素をすべて検索します。at
メソッドを使用して、検索結果の2番目の要素を取得します。text
メソッドを使用して、要素のテキストコンテンツを取得します。toEqual
メソッドを使用して、要素のテキストコンテンツが「Second child」であることを確認します。
第2番目(またはn番目)のノードを見つける方法は他にもあります。
- forEachメソッド
各要素に対してアクションを実行するために使用できます。 - findWhereメソッド
特定のプロパティを持つ要素を検索するために使用できます。 - filterメソッド
特定の条件に一致する要素を検索するために使用できます。
import React from 'react';
import { mount } from 'enzyme';
import jasmine from 'jasmine';
const MyComponent = () => (
<div>
<p>First child</p>
<p>Second child</p>
<p>Third child</p>
</div>
);
describe('MyComponent', () => {
it('should find the second child', () => {
const wrapper = mount(<MyComponent />);
const secondChild = wrapper.find('p').at(1);
expect(secondChild.text()).toEqual('Second child');
});
});
例2:filter
メソッドを使用する
import React from 'react';
import { mount } from 'enzyme';
import jasmine from 'jasmine';
const MyComponent = () => (
<div>
<p className="first-child">First child</p>
<p className="second-child">Second child</p>
<p className="third-child">Third child</p>
</div>
);
describe('MyComponent', () => {
it('should find the second child', () => {
const wrapper = mount(<MyComponent />);
const secondChild = wrapper.find('p').filterWhere(p => p.prop('className') === 'second-child');
expect(secondChild.length).toBe(1);
expect(secondChild.text()).toEqual('Second child');
});
});
import React from 'react';
import { mount } from 'enzyme';
import jasmine from 'jasmine';
const MyComponent = () => (
<div>
<p data-id="1">First child</p>
<p data-id="2">Second child</p>
<p data-id="3">Third child</p>
</div>
);
describe('MyComponent', () => {
it('should find the second child', () => {
const wrapper = mount(<MyComponent />);
const secondChild = wrapper.findWhere(p => p.prop('data-id') === '2');
expect(secondChild.length).toBe(1);
expect(secondChild.text()).toEqual('Second child');
});
});
例4:forEach
メソッドを使用する
import React from 'react';
import { mount } from 'enzyme';
import jasmine from 'jasmine';
const MyComponent = () => (
<div>
<p>First child</p>
<p>Second child</p>
<p>Third child</p>
</div>
);
describe('MyComponent', () => {
it('should find the second child', () => {
const wrapper = mount(<MyComponent />);
let secondChild;
wrapper.find('p').forEach((child, index) => {
if (index === 1) {
secondChild = child;
}
});
expect(secondChild.text()).toEqual('Second child');
});
});
import React from 'react';
import { mount } from 'enzyme';
import jasmine from 'jasmine';
const MyComponent = () => (
<div>
<p className="first-child">First child</p>
<p className="second-child">Second child</p>
<p className="third-child">Third child</p>
</div>
);
describe('MyComponent', () => {
it('should find the second child using CSS selector', () => {
const wrapper = mount(<MyComponent />);
const secondChild = wrapper.find('.second-child');
expect(secondChild.length).toBe(1);
expect(secondChild.text()).toEqual('Second child');
});
});
データ属性を使用する
import React from 'react';
import { mount } from 'enzyme';
import jasmine from 'jasmine';
const MyComponent = () => (
<div>
<p data-id="1">First child</p>
<p data-id="2">Second child</p>
<p data-id="3">Third child</p>
</div>
);
describe('MyComponent', () => {
it('should find the second child using data attribute', () => {
const wrapper = mount(<MyComponent />);
const secondChild = wrapper.find('[data-id="2"]');
expect(secondChild.length).toBe(1);
expect(secondChild.text()).toEqual('Second child');
});
});
Reactコンポーネントを使用する
import React from 'react';
import { mount } from 'enzyme';
import jasmine from 'jasmine';
const SecondChild = () => <p>Second child</p>;
const MyComponent = () => (
<div>
<p>First child</p>
<SecondChild />
<p>Third child</p>
</div>
);
describe('MyComponent', () => {
it('should find the second child using React component', () => {
const wrapper = mount(<MyComponent />);
const secondChild = wrapper.find(SecondChild);
expect(secondChild.length).toBe(1);
expect(secondChild.text()).toEqual('Second child');
});
});
render関数を使用する
import React from 'react';
import { render } from 'enzyme';
import jasmine from 'jasmine';
const MyComponent = () => (
<div>
<p>First child</p>
<p>Second child</p>
<p>Third child</p>
</div>
);
describe('MyComponent', () => {
it('should find the second child using render function', () => {
const tree = render(<MyComponent />);
const secondChild = tree.find('p')[1];
expect(secondChild.type).toEqual('p');
expect(secondChild.props.children).toEqual('Second child');
});
});
これらの方法は、状況に応じて柔軟に使用できます。
どの方法が最適かは、テスト対象のコンポーネントと目的によって異なります。
ヒント
- ノードに対してアクションを実行する必要がある場合は、
forEach
メソッドを使用できます。 - 特定の属性を持つノードを見つける必要がある場合は、
findWhere
メソッドを使用できます。 - 複数のノードを見つける必要がある場合は、
find
メソッドとfilter
メソッドを組み合わせて使用できます。
reactjs jasmine enzyme