【问题标题】:Returning a sinon stub from a sinon stub从 sinon 存根返回 sinon 存根
【发布时间】:2015-11-28 11:07:18
【问题描述】:

我无法让一个 sinon 存根返回/解析另一个 sinon 存根。我正在使用 sinon、chai、chai-as-promised 和 mocha。

我正在按顺序执行一些异步任务,我要测试的代码如下所示:

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”或 chai-as-promised 的“resolve”方法返回它时,我都会收到这个错误。

知道为什么会这样吗?

【问题讨论】:

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


    【解决方案1】:

    这一行:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 2015-01-18
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      相关资源
      最近更新 更多