LoginSignup
14
9

More than 5 years have passed since last update.

React+Material-UIなコンポーネントをEnzymeでテスト

Last updated at Posted at 2018-02-21

通常ReactのコンポーネントをEnzymeを使ってテストするには以下のように記述する感じ。

import React from 'react';
import { expect } from 'chai';
import { shallow, mount } from 'enzyme';
import sinon from 'sinon';
import MyComponent from './MyComponent';


it('renders without crashing', () => {
  const wrapper = mount(<MyComponent />);
  expect(wrapper.find("input[type='text']").length).to.equal(0);
});

しかし、この MyComponent が Material-UI に依存している場合はテストを実行すると以下のようなエラーが出てしまいます。

Warning: Failed context type: The context `muiTheme` is marked as required in `TextField`, but its value is `undefined`.

このエラーの意味は、MyComponentmuiTheme を必要としているよということなので、以下のように <MuiThemeProvider /> で囲むとエラーが出なくなります。

const wrapper = mount(<MuiThemeProvider><MyComponent /></MuiThemeProvider>);

でもこれでエラーが引っ込んだとしても、wrapper.props()wrapper.state() にうまいことアクセスできなかったりするので、テストをいい感じに記述することができません。

解決策

この問題を解決するには、以下のようにテストを記述することで解決できます。

import React from 'react';
import { expect } from 'chai';
import { shallow, mount } from 'enzyme';
import sinon from 'sinon';
import getMuiTheme from 'material-ui/styles/getMuiTheme';
import PropTypes from 'prop-types';
import MyComponent from './MyComponent';

const muiTheme = getMuiTheme();

it('renders without crashing', () => {
  const wrapper = mount(<MyComponent />, {
    context: { muiTheme },
    childContextTypes: { muiTheme: PropTypes.object },
  });

  expect(wrapper.find("input[type='text']").length).to.equal(0);
});

ポイントは以下の部分。

const wrapper = mount(<PasswordField id="hello" name="world" />, {
  context: { muiTheme },
  childContextTypes: { muiTheme: PropTypes.object },
});

あと、これに必要な以下のモジュールをロードしているところです。

import getMuiTheme from 'material-ui/styles/getMuiTheme';
import PropTypes from 'prop-types';

const muiTheme = getMuiTheme();
14
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
9