无法让chai.spy.on工作

时间:2015-11-21 22:56:37

标签: javascript unit-testing chai

请不要建议使用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个小时没有运气! :(

2 个答案:

答案 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();
});

如果这不起作用,那么它更具体地适用于patientControllerinitializePatientEvents方法的实现,而不是与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,则间谍创建的时间稍微偏离。目前,您的间谍功能关系的顺序是:

  1. 通话功能
  2. 间谍功能
  3. 期望窥探功能,让本叫
  4. 由于该函数在被调用时未被侦察,因此间谍完全错过了该呼叫。订单应该是:

    1. 间谍功能
    2. 通话功能
    3. 期望窥探功能,让本叫
    4. 但是,您处于一种棘手的情况,即您在监视的对象在调用构造函数之后才会存在。一种解决方法是断言initializePatientEvents的影响已经发生,而不是断言函数被调用。