用酶测试 React Component className
Testing React Component className with enzyme
当测试使用 className 设置 css class 使用酶(mount 或 shallow)的反应组件时,我能够正确测试它是 div 但无法让它在 h1 标签上工作。
这是一些
- mount or shallow 有什么关系?
- 这是我遗漏的东西吗?
- 这是一个错误吗?
任何想法表示赞赏!
JSX:
import React from 'react'
export const PageNotFound = ({heading, content, wrapperCSS, headingCSS, contentCSS}) => (
<div className={ wrapperCSS }>
<div className={ contentCSS }>
{ content }
</div>
<h1 className={ headingCSS }>{ heading }</h1>
</div>
)
PageNotFound.propTypes = {
heading: React.PropTypes.string,
content: React.PropTypes.string,
wrapperCSS: React.PropTypes.string,
headingCSS: React.PropTypes.string,
contentCSS: React.PropTypes.string
};
PageNotFound.defaultProps = {
heading: '404',
content: 'Page Not Found',
wrapperCSS: 'wrapper',
headingCSS: 'heading',
contentCSS: 'content'
};
export default PageNotFound
规格:
import React from 'react'
import { expect } from 'chai'
import { shallow, mount } from 'enzyme'
import PageNotFound from './PageNotFound'
describe('<PageNotFound/>', function() {
let wrapper;
beforeEach(() => {
wrapper = mount(<PageNotFound contentCSS="mycontent" headingCSS="myheader" content="Message" heading="My Title" />);
})
it('Uses heading prop', () => {
expect(wrapper.find('h1').text()).to.eq('My Title')
});
it('Uses headingCSS prop', () => {
console.log(wrapper.html());
expect(wrapper.find('h1.myheader').length).to.eq(1)
});
it('Uses content prop', () => {
expect(wrapper.find('div.mycontent').text()).to.eq('Message')
});
});
测试结果:
注意显示带有 class myheader 的 h1 的调试日志,但测试失败,发现 h1.myheader
的元素为零
<PageNotFound/>
✓ Uses heading prop
LOG LOG: '<div class="_2t--u"><h1 class="myheader">My Title</h1><div class="mycontent">Message</div></div>'
✗ Uses headingCSS prop
expected 0 to equal 1
r@tests.webpack.js:11:24087
assert@tests.webpack.js:14:52974
a@tests.webpack.js:14:55858
tests.webpack.js:15:17123
tests.webpack.js:14:10442
✓ Uses content prop
这里的问题是您的导入 import styles from './styles.module.css'
实际上没有被加载。
您可能在测试设置文件中有一些东西可以模拟任何带有 css 扩展名的东西:
require.extensions['.css'] = function () {
return null;
};
我没有足够的代表,否则我只会评论这个。不幸的是,我还不知道实际导入这些样式的方法,您可以从我的问题中看出:WebPack LESS imports when testing with Mocha
奇怪。它应该可以工作。
无论如何,您可以尝试利用 Enzyme 的 API。
对于这个特定的测试,.hasClass()
应该可以胜任并且更清楚其意图:
expect(wrapper.find('h1').hasClass('myheader')).to.eq(true)
当测试使用 className 设置 css class 使用酶(mount 或 shallow)的反应组件时,我能够正确测试它是 div 但无法让它在 h1 标签上工作。
这是一些
- mount or shallow 有什么关系?
- 这是我遗漏的东西吗?
- 这是一个错误吗?
任何想法表示赞赏!
JSX:
import React from 'react'
export const PageNotFound = ({heading, content, wrapperCSS, headingCSS, contentCSS}) => (
<div className={ wrapperCSS }>
<div className={ contentCSS }>
{ content }
</div>
<h1 className={ headingCSS }>{ heading }</h1>
</div>
)
PageNotFound.propTypes = {
heading: React.PropTypes.string,
content: React.PropTypes.string,
wrapperCSS: React.PropTypes.string,
headingCSS: React.PropTypes.string,
contentCSS: React.PropTypes.string
};
PageNotFound.defaultProps = {
heading: '404',
content: 'Page Not Found',
wrapperCSS: 'wrapper',
headingCSS: 'heading',
contentCSS: 'content'
};
export default PageNotFound
规格:
import React from 'react'
import { expect } from 'chai'
import { shallow, mount } from 'enzyme'
import PageNotFound from './PageNotFound'
describe('<PageNotFound/>', function() {
let wrapper;
beforeEach(() => {
wrapper = mount(<PageNotFound contentCSS="mycontent" headingCSS="myheader" content="Message" heading="My Title" />);
})
it('Uses heading prop', () => {
expect(wrapper.find('h1').text()).to.eq('My Title')
});
it('Uses headingCSS prop', () => {
console.log(wrapper.html());
expect(wrapper.find('h1.myheader').length).to.eq(1)
});
it('Uses content prop', () => {
expect(wrapper.find('div.mycontent').text()).to.eq('Message')
});
});
测试结果:
注意显示带有 class myheader 的 h1 的调试日志,但测试失败,发现 h1.myheader
的元素为零<PageNotFound/>
✓ Uses heading prop
LOG LOG: '<div class="_2t--u"><h1 class="myheader">My Title</h1><div class="mycontent">Message</div></div>'
✗ Uses headingCSS prop
expected 0 to equal 1
r@tests.webpack.js:11:24087
assert@tests.webpack.js:14:52974
a@tests.webpack.js:14:55858
tests.webpack.js:15:17123
tests.webpack.js:14:10442
✓ Uses content prop
这里的问题是您的导入 import styles from './styles.module.css'
实际上没有被加载。
您可能在测试设置文件中有一些东西可以模拟任何带有 css 扩展名的东西:
require.extensions['.css'] = function () {
return null;
};
我没有足够的代表,否则我只会评论这个。不幸的是,我还不知道实际导入这些样式的方法,您可以从我的问题中看出:WebPack LESS imports when testing with Mocha
奇怪。它应该可以工作。
无论如何,您可以尝试利用 Enzyme 的 API。
对于这个特定的测试,.hasClass()
应该可以胜任并且更清楚其意图:
expect(wrapper.find('h1').hasClass('myheader')).to.eq(true)