web-dev-qa-db-ja.com

酵素は浅いテストで子コンポーネントを見つけることができません

これは、酵素を使用してストアなしで反応/逆流テストを行う正しい方法ではありませんか?つまり、 "dumb"

_import React from 'react'
import { shallow, render } from 'enzyme'
import { Controls } from '../Controls' // named export
import LoadingSpinner from '../LoadingSpinner'
let wrapper
let loadingFlags = {
  controls: true
}
describe('<Controls />', () => {
  it('should render only the loading spinner', () => {
    wrapper = shallow(<Controls loadingFlags={loadingFlags} />) // this ensures the spinner will show until data is ready
    expect(wrapper.length).toEqual(1) // test passes
    expect(wrapper.find(LoadingSpinner)).to.have.length(1)
    // ^ TypeError: Cannot read property 'have' of undefined
  })
})
_

wrapper.html()をログに記録すると、_<img class='spinner' />_がレンダリングされていることがわかりますが、酵素はそれをコンポーネントとして見つけることができません。私にとって、 docs は、これがまさに私がすべきことであることを示しています。そのクラスの子をチェックできると思いますが、コンポーネント自体をチェックするよりも面倒なようです。たとえば、Spinnerコンポーネント内でクラスが変更されます。

この子コンポーネントの存在をテストするにはどうすればよいですか?

5
1252748

テストはshallowで正常に機能しますが、アサーションが存在しないため、TypeErrorがあります。Jestを使用しているように見えますが、酵素ドキュメントにはchaiBDDライブラリを使用したアサーションが表示されます。

代わりに、同等のJestを使用してください。

expect(wrapper.find(LoadingSpinner)).toHaveLength(1)
2
alechill

Mount()を使用する必要があります。

から https://github.com/airbnb/enzyme/blob/master/docs/guides/jsdom.md

import test from 'ava';
import React from 'react';
import { mount, shallow, render } from 'enzyme'

import LoadingSpinner, {Controls} from './LoadingSpinner';
// jsdom init start
const { JSDOM } = require('jsdom');

const jsdom = new JSDOM('<!doctype html><html><body></body></html>');
const { window } = jsdom;

function copyProps(src, target) {
    const props = Object.getOwnPropertyNames(src)
        .filter(prop => typeof target[prop] === 'undefined')
        .map(prop => Object.getOwnPropertyDescriptor(src, prop));
    Object.defineProperties(target, props);
}

global.window = window;
global.document = window.document;
global.navigator = {
    userAgent: 'node.js',
};
copyProps(window, global);
// jsdom init end

test('<Controls />' , t => {
    let wrapper = shallow(<Controls />);
    let mntWrapper = mount(<Controls />);
    t.true(wrapper.length == 1);
    t.true(wrapper.find(LoadingSpinner).length === 1);

    t.true(mntWrapper.find("img").length === 1);
    t.true(mntWrapper.render().find('img').length === 1);
    // if you need to test attributes check below.
    t.true(mntWrapper.render().find('img')[0].attribs.src.indexOf('foo') >= 0);
});
2
panghea