0

我有一个令人困惑的不工作测试,我无法以某种方式解决(我来自 Java 背景,所以如果我的术语中有一些错误,我很抱歉)。

有一个Trigger具有一些公共功能的对象类,foo()并且bar(). 逻辑是:

可以foo()直接调用另一个对象,或者如果bar()被调用(使用数组),则Trigger.bar()调用Trigger.foo() array.length次。

触发器是用 bluebird Promises 实现的。这是 Trigger 的基本摘录(我删除了一些逻辑,这似乎有点多余,但实际上发生的更多):

// Will be refactored afterwards
var self;

var Trigger  = function() {
  self = this;
};

Trigger.prototype.bar = function bar(members) {
  return new Promise(function (resolve, reject) {
    Promise.map(members, function (member) {
     self.foo(member)
     .then(function(res){
       ...
     })
     // catch
    });
  });
};

Trigger.prototype.foo = function foo(member) {
  return new Promise(function(resolve, reject){
    doSomethingWithMember(member)
    .then(function(res){
      ...
    })
    // catch
  });
}

所以可以看到,它bar()调用foo()了 members 数组中的每个成员

我想编写一个测试,在其中监视触发器对象并检查它是否调用了foo()n 次。

所以我目前所做的(更改了函数名称)我只是在检查它是否被调用:

var chai = require('chai');
var expect = chai.expect;
var sinon = require('sinon');
var sinonChai = require('sinon-chai');

chai.use(require('chai-as-promised'));
chai.use(sinonChai);

var Trigger = require(...);
var trigger = new Trigger();

      ...

  describe("bla", function() {
    it("should invoke 'foo()' n times", function() {
      var spy = sinon.spy(trigger.foo);
      var member = MemberBuilder.buildCorrect();
      trigger.bar(member);
      return expect(spy).to.have.been.called; // does not pass 
    })
  });

由于 Trigger 的承诺,这显然不起作用,因此告诉我:

AssertionError: expected foo to have been called at least once, but it was never called

但是无论我如何尝试在then() 块中解决这个问题bar(),它总是声称我的间谍没有被调用。

  describe("bla", function() {
    it("should invoke 'foo()' n times", function() {
      var spy = sinon.spy(trigger.foo);
      var member = MemberBuilder.buildCorrect();
      trigger.bar(member)
        .then(function(){
          return expect(spy).to.have.been.called; // does not pass with the same AssertionError (has not been invoked)
      });
    })

我已经做了一些日志记录,并且确信它foo()被调用了。关于我做错了什么的任何想法?

问候,

vegaaa

4

1 回答 1

0

我发现了我的(愚蠢的!)错误。误读 API...

var spy = sinon.spy(trigger.foo);

应该成为

var spy = sinon.spy(trigger, "foo");

所以这就像一个魅力:

describe("bla", function() {
  it("should invoke 'foo()'", function() {
    var spy = sinon.spy(trigger, "foo");
    var member = MemberBuilder.buildCorrect();
    trigger.bar(member)
    .then(function(res) {
      return expect(spy).to.have.been.called;
    })
  })

或者(因为我发现它更容易理解):

describe("bla", function() {
    it("should invoke 'foo()'", function() {
      sinon.spy(trigger, "foo");
      var member = MemberBuilder.buildCorrect();
      trigger.bar(member)
      .then(function() {
        return expect(trigger.foo).to.have.been.called;
      })
    })

希望这可以帮助其他人遇到与 api 相同的问题。

于 2017-10-05T11:52:39.707 回答