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
    });
});