【问题标题】:Sinon Spy + ReactJs property initializers syntaxSinon Spy + ReactJs 属性初始化器语法
【发布时间】:2019-04-01 06:05:16
【问题描述】:

我正在尝试使用 Enzyme + Sinon 间谍测试 React 组件。我的反应代码在我的组件实例中使用属性初始化器语法:

class FixedButton extends React.Component {

    handleMouseOver = (e) => {
        const { fixedButtonHover = _fixedButtonHover } = this.props;
        const { backgroundColor, color } = fixedButtonHover;
        e.target.style.backgroundColor = backgroundColor;
        e.target.style.color = color;
    }
}

我正试图弄清楚如何监视 handleMouseOver 函数,尽管据我了解,由于上下文绑定到实例而不是原型上的属性,所以我无法监视它。

我知道该函数被调用,并且我知道我可以通过将我的语法修改为标准属性样式来使间谍正常工作。我也知道组件的挂载实例具有方法作为属性。

这是两者不能一起工作的情况之一,还是有我没看到的技巧?

编辑:这是我尝试建议解决方案的方式,但 spy.callOncespy.call 一样返回 false:

test('FixedButton component methods are called as expected', t => {

    const wrapper = mount(<FixedButton />);
    const instance = wrapper.instance();
    const spy = sinon.spy(instance, 'handleMouseOver');

    const button = wrapper.find('button');
    button.simulate('mouseover');

    t.is(spy.calledOnce, true);
})

【问题讨论】:

    标签: javascript reactjs sinon enzyme


    【解决方案1】:

    带有bind 的原型方法更适合for several reasons including testability,它们可以在类实例化之前被监视或模拟。这对于在构造函数或初始生命周期钩子中调用的方法很重要。

    handleMouseOver 显然是在组件实例化后触发的事件处理程序,因此只要组件实例可以通过 Enzyme 访问,它就可以被窥探。设置间谍后需要重新渲染组件,以便&lt;button&gt; 接收新的事件处理程序。有a bug with Enzyme update(),需要解决:

    const instance = wrapper.instance();
    const spy = sinon.spy(instance, 'handleMouseOver');
    instance.forceUpdate(); // necessary for button to receive proper handler
    
    const button = wrapper.find('button');
    button.simulate('mouseover');
    
    t.is(spy.calledOnce, true);
    

    【讨论】:

    • 感谢您的回答,也感谢您的解释。我尝试了这种语法,虽然没有抛出错误,但间谍没有报告它被调用多少次的正确结果。尽管在 handleMouseOver 函数中登录。
    • 请在问题中提供stackoverflow.com/help/mcve 您究竟是如何尝试的。
    • 更新了答案,了解wrapper.update() 错误很有趣。即使你在这里尝试update,它也行不通。至于我,我一直在使用带有bind 的原型方法。在 React 中这不是一个问题,但原型仍然提供了额外的抽象层。
    • 谢谢!解决了。很奇怪的问题。
    猜你喜欢
    • 2012-11-13
    • 2017-11-05
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    相关资源
    最近更新 更多