javascript - 使用 Chai 监视/测试事件处理程序上的触发器是否有效

标签 javascript unit-testing marionette chai

我对 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 radio 。上面的事件处理程序代码运行良好。现在,我想要一个 chai 测试,它将检查事件的监听器是否收到了触发器或广播请求。我不知道从哪里开始以及如何写。

最佳答案

正如 @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对对象属性的巧妙使用。

关于javascript - 使用 Chai 监视/测试事件处理程序上的触发器是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33835806/

相关文章:

javascript - React (Native) 设置 Jest 来测试 Context 组件

JavaScript 按属性对所有其他子元素进行排序,但 (this)

c# - 在哪里写单元测试代码?

cocoa - OCMock 异步 block 回调

marionette - 使用 Marionette 将全局助手注入(inject)所有下划线模板

backbone.js - Backbone JS、Marionette 和 Require JS

javascript - 自动 HTML 页面刷新保留滚动位置,使用 anchor

javascript - 一个简单的 JavaScript 函数由于奇怪的错误而拒绝工作

reactjs - 如何模拟从另一个文件导入的 jest 函数作为默认值

javascript - Marionette onAttach 事件