4

我正在努力将我的应用程序更新到最新版本的 React、Enzyme 和 Material-UI。

我知道在版本 15 中,Material-UI 删除了如果没有给出默认主题组件将创建的默认主题组件。现在首选的方法是使用具有MuiThemeProvider我们想要使用的样式的组件来包装整个应用程序。这可以毫无障碍地工作,但是我的测试现在不应该中断。

任何使用 Material-UI 组件并且我调用的组件ShallowWrapper.html()现在都会使我的测试失败并显示以下消息:TypeError: Cannot read property 'prepareStyles' of undefined

请注意,如果我不使用ShallowWrapper.html(),我不会收到任何错误。所以只有当我需要查看它失败的 HTML 输出时。这是有道理的,Material-UI 应该只在实际渲染某些东西时才关心样式。

我创建了一个非常简单的测试用例来展示我是如何做到的:

import * as React from 'react'
import * as chai from 'chai'
import chaiEnzyme = require('chai-enzyme')
import { shallow } from 'enzyme'
import Avatar from 'material-ui/Avatar'
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'

chai.use(chaiEnzyme());
let expect = chai.expect;

describe('Unit Test', () => {
    it(`Should work`, () => {
        let shallowComponent = shallow(
            <MuiThemeProvider>
                <Avatar src='foo.jpg' />
            </MuiThemeProvider>
        );
        expect(shallowComponent.html()).to.exist
    })
});

我认为简单地包装我的组件应该可以工作。显然,我在某处遗漏了一步。谁能指出我正确的方向?

4

1 回答 1

5

您需要mount在这种情况下使用,shallow仅将组件渲染一层深度,因此它不会以这种方式渲染子组件,试试这个:

describe('Unit Test', () => {
    it(`Should work`, () => {
        let shallowComponent = mount(
            <MuiThemeProvider>
                <Avatar src='foo.jpg' />
            </MuiThemeProvider>
        );
        expect(shallowComponent.html()).to.exist
    })
});
于 2016-06-27T21:44:30.503 回答