提问者:小点点

从sinon存根返回sinon存根


我在获取一个sinon存根以返回/解析另一个sinon存根时遇到问题。我正在使用西农、柴、柴和摩卡。

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

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

我尝试为此创建存根的尝试如下所示:

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

“saveit”方法在Terminal.prototype,这就是为什么我需要在那里存根它。当我尝试运行它时,我收到错误消息:

Unhandled rejection TypeError: undefined is not a function

在线上:

return terminal.saveit();

但如果我在控制台中转储终端对象,它看起来很好,就像任何其他存根对象一样(至少在我的头脑中是这样的)。在测试中,存根的saveit()方法可以称为“独立”。但每当我通过chai的“return”或chaipromise的“resolve”方法返回它时,我就会得到这个错误。

知道为什么会这样吗?


共1个答案

匿名用户

此行:

findOneStub.resolves(saveitStub)

导致终端.findOneAsync 返回存根函数,而不是终端实例。显然,存根函数没有名为 saveit 的属性,即使终端.prototype 有。由于未知属性返回为未定义,因此您最终尝试将未定义作为函数调用。

要进行这样的测试,您可能最好构造一个< code>Terminal的实例,并清除它的< code>saveit方法。如果由于某种原因构造一个实例太困难,可以使用< code > sinon . createstuinstance 。因为我不知道你的构造函数的签名,所以我就以此为例:

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