Mih*_*šič 10 javascript reactjs jestjs enzyme
我有以下组件:
import React, { Component } from 'react';
import {Link, IndexLink} from 'react-router';
class Navbar extends Component {
renderLinks = (linksData) => {
return linksData.map((linkData) => {
if(linkData.to === '/') {
return(
<div className="navbar-link-container" key={linkData.to}>
<IndexLink activeClassName="navbar-active-link" to={linkData.to}>
<i className="navbar-icon material-icons">{linkData.icon}</i>
<span className="navbar-link-text">{linkData.text}</span>
</IndexLink>
</div>
)
}
else {
return(
<div className="navbar-link-container" key={linkData.to}>
<Link activeClassName="navbar-active-link" to={linkData.to}>
<i className="navbar-icon material-icons">{linkData.icon}</i>
<span className="navbar-link-text">{linkData.text}</span>
</Link>
</div>
)
}
})
};
render() {
return (
<div className={`navbar navbar-${this.props.linksData.length}`}>
{this.renderLinks(this.props.linksData)}
</div>
)
}
}
Navbar.propTypes = {
linksData: React.PropTypes.array.isRequired,
};
export default Navbar;
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试编写一个单元测试来检查if条件(根据.to属性返回IndexLink或Link):
但我似乎无法测试函数的确切jsx返回,因为当我在console.log中返回一个返回时我得到了这个:
{'$$ typeof':Symbol(react.element),输入:'div',key:'/',ref:null,props:{className:'navbar-link-container',children:{'$$ typeof ':Symbol(react.element),类型:[Object],key:null,ref:null,props:[Object],_ owner:null,_store:{}}},_ owner:null,_store:{}}
这是我到目前为止所做的测试:
it('renderLinks should return a IndexLink', () => {
const wrapper = shallow(<Navbar linksData={mockLinksData}/>);
const renderLinksReturn = wrapper.instance().renderLinks(mockLinksData);
let foundIndexLink = false;
renderLinksReturn.map((linkHtml) => {
console.log(linkHtml);
});
expect(foundIndexLink).toBe(true);
})
Run Code Online (Sandbox Code Playgroud)
现在我不知道要测试什么来查看函数是否正确运行.有没有办法像组件一样"挂载"函数的返回?或者是否有一个简单的方法来返回我可以检查的实际返回的html字符串?
Nac*_*tha 16
面对类似的问题,我们将jsx组件作为prop传递给另一个组件.
您可以浅显示返回的jsx,因为它就像一个有效的React Stateless Component.例如:
const renderLinks = shallow(wrapper.instance().renderLinks(mockLinksData))
Run Code Online (Sandbox Code Playgroud)
继续你常用的酶断言.
为了建立在@Nachiketha 的答案之上,当返回的内容是 a 时,该语法将不起作用fragment,这可以通过将结果包装为div类似内容来解决:
const renderLinks = shallow(<div>
{wrapper.instance().renderLinks(mockLinksData)
</div>
)}
Run Code Online (Sandbox Code Playgroud)
正如本步中所建议的那样。
我想你不需要打电话
const renderLinksReturn = wrapper.instance().renderLinks(mockLinksData);
Run Code Online (Sandbox Code Playgroud)
因为它将在Navbar渲染时被调用。
您的解决方案是正确的,但如果您需要一些替代的可靠方法来测试它。
由于此测试专门测试IndexLink并假设mockLinksData包含to = "/"
it('renderLinks should return a IndexLink when passed a link with to:\"/\"', () => {
const wrapper = shallow(<Navbar linksData={mockLinksData}/>);
// You can use both component name or component displayname
// IndexLink or "IndexLink"
expect(wrapper.find('IndexLink')).to.have.length(1);
// In case you want to test whether indexLink has appropriate props or classes.
const indexLink = wrapper.find(IndexLink).first();
// Check whether indexLink has pass prop
expect(indexLink.props().to).to.equal("/");
// Check whether indexLink has correct classes set.
expect(indexLink.hasClass('navbar-active-link')).to.equal(true);
// Check whether indexLink displays the link test correctly
expect(indexLink.find('navbar-link-text').text()).to.equal(mockLinksData.text);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9538 次 |
| 最近记录: |