用Sinon存根一个React组件方法
Stubbing a React component method with Sinon
我正在尝试存根一个React组件方法用于测试目的:
var Comp = React.createClass({
displayName: "Comp",
plop: function() {
console.log("plop");
},
render: function() {
this.plop();
return React.DOM.div(null, "foo");
}
});
var stub = sinon.stub(Comp.type.prototype, "plop");
React.addons.TestUtils.renderIntoDocument(Comp());
sinon.assert.called(stub); // throws
不幸的是,这将继续在控制台上打印"plop"…并且断言失败。
注意:直接存根spec对象方法是有效的,但是你必须分别导出组件构造函数和spec,这样它们在测试中都可用…此外,你需要在创建组件类之前存根spec;不太方便:
var CompSpec = {
displayName: "Comp",
plop: function() {
console.log("plop");
},
render: function() {
this.plop();
return React.DOM.div("foo");
}
};
var stub = sinon.stub(CompSpec, "plop");
var Comp = React.createClass(CompSpec);
React.addons.TestUtils.renderIntoDocument(Comp());
// plop() is properly stubbed, so you can
sinon.assert.called(stub); // pass
你能想到另一种策略来轻松地存根React组件方法吗?
您遇到了React的自动绑定功能,该功能缓存了包装在类方法周围的.bind(this)
。您可以通过在React的__reactAutoBindMap
中存根方法的缓存版本来使代码工作:
var Comp = React.createClass({
displayName: "Comp",
plop: function() {
console.log("plop");
},
render: function() {
this.plop();
return React.DOM.div(null, "foo");
}
});
// with older versions of React, you may need to use
// Comp.type.prototype instead of Comp.prototype
var stub = sinon.stub(Comp.prototype.__reactAutoBindMap, "plop"); // <--
React.addons.TestUtils.renderIntoDocument(React.createElement(Comp));
sinon.assert.called(stub); // passes
您使用的是哪个测试框架?
如果你使用jasmine,我发现jasmine- React是一个很有用的库,可以监视React方法,也可以用测试存根替换组件。
在这种情况下,您可以轻松地在组件定义之外监视您的方法。//Component Definition
var Comp = React.createClass({
displayName: "Comp",
plop: function() {
console.log("plop");
},
render: function() {
this.plop();
return React.DOM.div(null, "foo");
}
});
//test
it("should call plop method on render", function(){
//spy on method
jasmineReact.spyOnClass(Comp, "plop");
React.addons.TestUtils.renderIntoDocument(Comp());
expect(Comp.plop).toHaveBeenCalled();
})
jasmineReact.spyOnClass
返回一个普通的茉莉间谍,你可以用它来跟踪调用它和它的参数。
如果你想要存根方法并让它返回一些东西,你可以这样做jasmineReact.spyOnClass(Comp, "plop").andReturn('something')
相关文章:
- 如何在react js中将值从一个组件发送到另一个组件
- 如何在react js中从一个页面导航到另一个页面
- React应用程序:道具在下一个事件后更新
- React Router一直给我一个警告:你不能更改<路由器路由>
- 使用react router/react router redux将特定的redux操作绑定到一个路由
- 可以在React Native中制作一个自哈希应用程序
- React渲染一个组件,然后单击另一个React组件
- 将react组件动态插入到另一个react组件中
- 如何使用ReactDOM渲染来渲染一个react组件
- ReactJS:在循环中返回一个React组件
- 如何在一个react类的实例中选择元素
- 用Sinon存根一个React组件方法
- 生产模式下的UglifyJSPlugin显示一个React开发模式警告
- 从另一个元素创建一个React元素在ReactJs中是有效的
- ag-Grid中的cellRenderer函数能返回一个React组件吗?
- 是否有一个React生命周期方法,只在组件第一次接收到props时才做一些事情?
- 部署我的第一个React应用
- 在另一个React组件中添加新的React模块
- 一个react组件可以有多个用于子内容的区域吗?
- 为什么一个react onClick事件附加一个问号到我的url