Javascript Sinon.js-存根反应组件';在实例化组件之前调用函数?
假设我有一个组件,看起来像这样:Javascript Sinon.js-存根反应组件';在实例化组件之前调用函数?,javascript,reactjs,sinon,Javascript,Reactjs,Sinon,假设我有一个组件,看起来像这样: var React = require('react/addons'); var ExampleComponent = React.createClass({ test : function () { return true; }, render : function () { var test = this.test(); return ( <div cla
var React = require('react/addons');
var ExampleComponent = React.createClass({
test : function () {
return true;
},
render : function () {
var test = this.test();
return (
<div className="test-component">
Test component - {test}
</div>
);
}
});
module.exports = ExampleComponent;
但有没有一种方法可以让Sinon在每次创建组件实例时自动删除该组件的功能?例:
sinon.stubAll(ExampleComponent, 'test').returns(false); //something like this
var renderedComponent = TestUtils.renderIntoDocument(<ExampleComponent/>);
expect(renderedComponent.test).toBe(false); //I'd like this to pass
sinon.stubAll(ExampleComponent,'test')。返回(false)//像这样的
var renderedComponent=TestUtils.renderIntoDocument();
expect(renderedComponent.test).toBe(false)//我希望这件事过去
如果这是不可能的,是否有一个潜在的解决方案接近于提供我正在寻找的功能?您将需要覆盖
ExampleComponent.prototype
而不是ExampleComponent
<代码>示例组件是一个构造函数。像test()
这样的本地方法保存在它的prototype
中
sinon.stub(ExampleComponent.prototype, 'test').returns(false);
var renderedComponent = TestUtils.renderIntoDocument(<ExampleComponent/>);
expect(renderedComponent.test).toBe(false); //passes
sinon.stub(ExampleComponent.prototype,'test')。返回(false);
var renderedComponent=TestUtils.renderIntoDocument();
expect(renderedComponent.test).toBe(false)//通行证
我找到了解决问题的方法
为了澄清这一点,我的问题是我想剔除属于在父组件下呈现的子组件的函数。比如说:
var React = require('react/addons');
var ExampleComponent = React.createClass({
test : function () {
return true;
},
render : function () {
var test = this.test();
return (
<div className="test-component">
Test component - {test}
</div>
);
}
});
module.exports = ExampleComponent;
parent.js
var Child = require('./child.js');
var Parent = React.createClass({
render : function () {
return (
<div className="parent">
<Child/>
</div>
);
}
});
module.exports = Parent;
var Child = React.createClass({
test : function () {
return true;
},
render : function () {
if (this.test) {
throw('boom');
}
return (
<div className="child">
Child
</div>
);
}
});
module.exports = Child;
不过,我还是找到了一个适合我需要的解决方案。我将我的测试框架从Mocha切换到Jasmine,并开始使用它,它提供了一些好处,包括能够在实例化一个类之前去掉它的函数。以下是一个有效解决方案的示例:
var React = require('react/addons'),
Parent = require('./parent.js'),
Child = require('./child.js'),
jasmineReact = require('jasmine-react-helpers');
describe('Parent', function () {
it('does not blow up when rendering', function () {
jasmineReact.spyOnClass(Child, 'test').and.returnValue(false);
var parentInstance = jasmineReact.render(<Parent/>, document.body); //does not blow up
expect(parentInstance).toBeTruthy(); //passes
});
});
var React=require('React/addons'),
Parent=require('./Parent.js'),
Child=require('./Child.js'),
jasmineReact=require('jasmine-react-helpers');
描述('父',函数(){
它('渲染时不会爆炸',函数(){
jasmineReact.spyOnClass(Child,'test')。和.returnValue(false);
var parentInstance=jasmineReact.render(,document.body);//不会爆炸
expect(parentInstance).toBeTruthy();//传递
});
});
我希望这能帮助其他有类似问题的人。如果有人有任何问题,我很乐意帮助。谢谢你的回答。虽然它似乎在某些情况下有效,但它并不完全符合我的要求。我可能应该更具体一点。我有一个父组件和一个子组件,子组件在父组件的
render
方法中进行渲染。父级使用require()
获取构造函数,并且似乎没有办法在我的测试中覆盖子级的原型。这有意义吗?如果你愿意,我可以用一个例子来更新我的问题。如果你能用一个例子来扩展这个问题,那就太好了。我找到了一个有效的解决方案,但我仍然会奖励你。
var React = require('react/addons'),
Parent = require('./parent.js'),
Child = require('./child.js'),
jasmineReact = require('jasmine-react-helpers');
describe('Parent', function () {
it('does not blow up when rendering', function () {
jasmineReact.spyOnClass(Child, 'test').and.returnValue(false);
var parentInstance = jasmineReact.render(<Parent/>, document.body); //does not blow up
expect(parentInstance).toBeTruthy(); //passes
});
});