Spying/testing 如果使用 Chai 触发事件处理程序
Spying/testing if trigger on event handler works using 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收音机。上面的事件处理程序代码运行良好。现在,我想要一个 chai 测试,它将检查事件的侦听器是否收到了触发器或广播请求。我不确定从哪里开始以及我将如何编写它。
正如@Sgni 提到的,您需要监视您的函数以 1) 知道它是否被调用,以及 2) 检查它的 return 值。这样做的 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;
};
}
如您所见,它将您的原始函数包装在一个闭包中,它保留对您原始函数的 return 值的引用,以及该函数是否被调用。
Sinon-Chai 为您提供了很好的语法,因此您可以做出如下可读的断言:
expect(yourObject.onPatientAdded).to.have.been.calledOnce;
expect(yourObject.onPatientAdded).to.have.returned(something);
所以是的,似乎有很多魔法,但魔法来自 Sinon 使用 JavaScript 闭包和 Sinon-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收音机。上面的事件处理程序代码运行良好。现在,我想要一个 chai 测试,它将检查事件的侦听器是否收到了触发器或广播请求。我不确定从哪里开始以及我将如何编写它。
正如@Sgni 提到的,您需要监视您的函数以 1) 知道它是否被调用,以及 2) 检查它的 return 值。这样做的 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;
};
}
如您所见,它将您的原始函数包装在一个闭包中,它保留对您原始函数的 return 值的引用,以及该函数是否被调用。
Sinon-Chai 为您提供了很好的语法,因此您可以做出如下可读的断言:
expect(yourObject.onPatientAdded).to.have.been.calledOnce;
expect(yourObject.onPatientAdded).to.have.returned(something);
所以是的,似乎有很多魔法,但魔法来自 Sinon 使用 JavaScript 闭包和 Sinon-Chai 巧妙地使用对象属性。