我有一个问题,让一个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的“解决”方法返回时,我都会收到此错误。
知道为什么会这样吗?
答案 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);