请不要建议使用Sinon。我希望特别是chai.spy.on在你的帮助下得到chai-spies。基本上,我有这个规格。在PatientController中的initialize方法中,我调用this.initializePatientEvents();
beforeEach(function() {
this.patientController = new PatientController({model: new Backbone.Model(PatientModel)});
});
it('executes this.initializePatientEvents', function () {
let spy = chai.spy.on(this.patientController, 'initializePatientEvents');
expect(spy).to.have.been.called();
});
但是,测试失败并出现此错误
AssertionError: expected { Spy } to have been called
at Context.<anonymous>
我现在花了近3个小时没有运气! :(
答案 0 :(得分:2)
将上面的评论移到上面的回复中:
查看您的代码,我只是不确定this
引用所指的内容。根据您的错误消息,它似乎与上下文有关。因此,我会尝试这样的事情:
var patientController;
beforeEach(function() {
patientController = new PatientController({model: new Backbone.Model(PatientModel)});
});
it('executes this.initializePatientEvents', function () {
let spy = chai.spy.on(patientController, 'initializePatientEvents');
expect(spy).to.have.been.called();
});
如果这不起作用,那么它更具体地适用于patientController
和initializePatientEvents
方法的实现,而不是与chai.spy相关的内容。
修改强> 这是我在本地设置的东西,我能够通过测试。主要区别在于我没有使用Backbone,而是创建了自己的构造函数。
"use strict";
var chai = require("chai");
var sinon = require("sinon");
var sinonChai = require("sinon-chai");
chai.use(sinonChai);
var expect = chai.expect;
var should = chai.should();
describe("PatientController Test", function() {
var PatientController;
var initializePatientEventsSpy;
var patient;
beforeEach(function() {
PatientController = function(name, age) {
this.name = name;
this.age = age;
this.initializePatientEvents();
};
PatientController.prototype.initializePatientEvents = function() {
console.log("Do some initialization stuff here");
};
initializePatientEventsSpy = sinon.spy(PatientController.prototype, "initializePatientEvents");
});
it("should test initializePatientEvents was called", function() {
patient = new PatientController("Willson", 30);
initializePatientEventsSpy.should.have.been.called;
});
});
答案 1 :(得分:0)
如果PatientController
构造函数调用initializePatientEvents
,则间谍创建的时间稍微偏离。目前,您的间谍功能关系的顺序是:
由于该函数在被调用时未被侦察,因此间谍完全错过了该呼叫。订单应该是:
但是,您处于一种棘手的情况,即您在监视的对象在调用构造函数之后才会存在。一种解决方法是断言initializePatientEvents
的影响已经发生,而不是断言函数被调用。