【问题标题】:Spying/testing if trigger on event handler works using Chai监视/测试事件处理程序上的触发器是否使用 Chai
【发布时间】:2015-11-20 20:47:20
【问题描述】:

我对 Chai 测试非常陌生。我找不到好的例子。基本上,我想要发生的是检查事件是否被触发。

在我的 patientInfo.js 上,触发事件的代码是

import PatientBus from 'backbone.radio';
patientAdded() {
  PatientBus.trigger('patient:added');
},

然后在我的 patientEvents.js 上

import PatientBus from 'backbone.radio';
this.listenTo(PatientBus, 'patient:added', this.onPatientAdded);

onPatientAdded: function onPatientAdded() {
  // blah blah blah 
}

忘了说,我用的是 Marionette 收音机。上面的事件处理程序代码运行良好。现在,我想要一个 chai 测试来检查事件的侦听器是否收到了触发或广播请求。我不知道从哪里开始以及如何写。

【问题讨论】:

  • 你可能想使用间谍,来自sinon 和你的柴:sinonjs.org

标签: javascript unit-testing marionette chai


【解决方案1】:

正如@Sgni 提到的,您需要监视您的函数以 1)知道它是否被调用,以及 2)检查它的返回值。执行此操作的 Sinon 语法是:

sinon.spy(yourObject, 'onPatientAdded');

为了让您直观了解其工作原理,Sinon 文档将其列为示例:

function once(fn) {
    var returnValue, called = false;
    return function () {
        if (!called) {
            called = true;
            returnValue = fn.apply(this, arguments);
        }
        return returnValue;
    };
}

如您所见,它将原始函数包装在一个闭包中,该闭包保留对原始函数返回值的引用,以及该函数是否被调用。

Sinon-Chai 只是为您提供了很好的语法,因此您可以做出如下可读的断言:

expect(yourObject.onPatientAdded).to.have.been.calledOnce;
expect(yourObject.onPatientAdded).to.have.returned(something);

是的,似乎有很多魔法,但魔法来自于 Sinon 对 JavaScript 闭包的使用和 Sinon-Chai 对对象属性的巧妙使用。

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 2022-07-21
    • 2013-11-23
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多