我有以下组成部分:
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;
现在我正在尝试编写一个单元测试来检查if条件(根据.to属性返回IndexLink或Link):
但我似乎无法测试函数的确切jsx返回,因为当我使用控制台时。记录我得到的其中一个返回:
{$$typeof':Symbol(react.element),type:'div',key:'/',ref:null,props:{className:'navbar link container',children:{$$typeof':Symbol(react.element),type:[Object],key:null,ref:null,props:[Object],_owner:null,{}},{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);
})
现在我不知道要测试什么来查看函数是否正确运行。有没有办法像组件一样“装载”函数的返回?或者是否有一个简单的方法来返回一个html字符串的实际返回,我可以对照它进行检查?
我想你不需要打电话
const renderLinksReturn = wrapper.instance().renderLinks(mockLinksData);
当呈现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);
});
要在@Nachiketha的答案之上构建,当返回的是片段
时,该语法将不起作用,这可以通过将结果包装在一个div
中来解决,例如:
const renderLinks = shallow(<div>
{wrapper.instance().renderLinks(mockLinksData)
</div>
)}
如本节所述。
我们在将jsx组件作为道具传递给另一个组件时遇到了类似的问题。
您可以浅层呈现返回的jsx,因为它类似于有效的React函数/无状态组件。如:
const renderLinks = shallow(wrapper.instance().renderLinks(mockLinksData))
继续你通常的酶断言。
我正在尝试使用{mount}方法对我的React类组件进行单元测试。当我尝试访问class变量(使用这个关键字)时,运行测试会给出一个未定义的错误。下面的示例,其中调用后,此.DataSource的计算结果为未定义
好的,我有点困惑于如何使用enzyme/jest测试我的组件的功能。仍在学习如何测试我的组件——我可以编写简单的测试,但现在我需要让它们更复杂。 我想知道测试组件函数是否被正确调用以及它们是否按预期更新状态道具的最佳方法。我发现很棘手的是,我的函数和状态都存在于我的组件的道具中。 如果我需要使用间谍,我想最好知道如何使用笑话,但是如果像西农或贾斯敏这样的特工更适合这份工作,我愿意接受(只要让我知道
问题内容: 我的组件测试文件中有一个像这样的模拟模块 这些函数将在我的组件的渲染函数中调用以隐藏和显示某些特定功能。 我想对这些模拟函数的返回值的不同组合进行快照。 假设我有一个这样的测试用例 要运行此测试用例,我想更改模拟模块函数的返回值以使其动态变化 因为我已经一次导入了组件,所以我的模拟模块不会再次重新导入。所以它不会改变。我该如何解决? 问题答案: 您可以模拟该模块,以便它返回间谍并将其导
测试方法: 测试用例:
问题内容: 我想测试以下使用api的类。 快速搜索没有发现任何执行此操作的示例。有人成功吗?我将如何嘲笑裁判? 理想情况下,我想使用。 更新资料 所以我可以使用回调引用进行测试,如下所示 然后测试类似 问题答案: 没有特定的例程可以测试参考。引用只是带有键的对象。 如果它是在早期访问的,则需要禁用生命周期挂钩进行测试。应该测试组件最初是否具有引用,然后可以对其进行模拟 由于ref作为prop传递给
问题内容: 我有一个React组件(为了演示该问题,对此进行了简化): 现在,我要测试提供的值的调用。 为此,我想创建一个代替组件方法的笑话模拟函数。 到目前为止,这是我的测试用例: 但是我在控制台中得到的只是: 语法错误 所以我的问题是,如何正确地用酶模拟组分方法? 问题答案: 可以通过以下方式模拟该方法: 您还需要在被测组件的包装器上调用.update,以便正确注册模拟功能。 语法错误来自错误