监视/测试事件处理程序上的触发器是否使用Chai工作

Spying/testing if trigger on event handler works using Chai

本文关键字:是否 Chai 工作 触发器 测试 事件处理 程序上 监视      更新时间:2023-09-26

我对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测试,它将检查事件的侦听器是否接收到触发器或广播请求。我不确定从哪里开始以及如何编写。

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