从一个sinon存根中返回一个sinon存根

时间:2015-09-02 19:34:20

标签: javascript mocha sinon chai-as-promised sinon-chai

我有一个问题,让一个sinon存根返回/解决另一个sinon存根。我正在使用sinon,chai,chai-as-promised和mocha。

我按顺序执行了许多异步任务,我要测试的代码看起来像这样:

app.factory('DoubleTap', function($firebaseArray, $q) {
   var theOtherPath = new Firebase(...);
   return $firebaseArray.$extend({
      $add: function(recordOrItem) {
         var self = this;
         return $firebaseArray.prototype.$add.apply(this, arguments).then(function(ref) {
             var rec = self.$getRecord(ref.key());
             var otherData = ...do something with record here...;
             return $q(function(resolve, reject) {
                 theOtherPath.push(rec.$id).set(otherData);
             });
         });
      }
   });
});

我为此创建存根的尝试看起来像这样:

Terminal.findOneAsync({terminalId: terminalId}).then(function(terminal) {
  terminal.lastSeen = timestamp;
  return terminal.saveit();
}).then(function(terminal) {
 //continue to do other stuff
});

“saveit”方法在Terminal.prototype中,这就是我需要在那里存根的原因。 当我尝试运行时,我收到错误:

var saveitStub = sinon.stub(Terminal.prototype, 'saveit');
saveitStub.resolves(terminalUpdated);
var findOneStub = sinon.stub(Terminal, 'findOneAsync');
findOneStub.resolves(saveitStub);

在这一行:

Unhandled rejection TypeError: undefined is not a function

但是,如果我将终端对象转储到控制台中,它看起来很好,就像任何其他存根对象一样(至少对我来说简单)。 stubbed saveit()方法可以在测试中称为“独立”。但每当我通过chai的“返回”或chai-as-promised的“解决”方法返回时,我都会收到此错误。

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

这一行:

findOneStub.resolves(saveitStub)

导致Terminal.findOneAsync返回存根函数,而不是终端实例。显然,即使saveit确实存在,存根函数也没有名为Terminal.prototype的属性。由于未知属性以undefined的形式返回,因此您尝试将undefined作为函数调用时会结束。

要进行这样的测试,您可能最好不要构建Terminal的实例并将其saveit方法存根。如果由于某种原因构建实例太困难,可以使用sinon.createStubInstance。由于我不知道你的构造函数的签名,我将继续这样做:

var terminal = sinon.createStubInstance(Terminal);
var saveitStub = terminal.saveit
saveitstub.resolves(terminalUpdated)
var findOneStub = sinon.stub(Terminal, 'findOneAsync')
findOneStub.resolves(terminal);