【问题标题】:Different Mocha behaviour - async/sync promises不同的 Mocha 行为 - 异步/同步承诺
【发布时间】:2017-12-18 06:36:12
【问题描述】:

我最近遇到了一个奇怪的行为。我有一个包含大量测试的大项目,其中一些测试是以同步方式编写的,假设 Promise 库是没有deferred 的库。

但是,在我的机器上准备好环境之后(Mac OS X,nodeJS 0.12.18 - 我知道 :( ),测试似乎以不同的承诺实现运行 - 这次使用延迟的异步版本,因此以下测试失败:

// Some generic mocking code here

instance.doSomething(); // This returns a promise

// Immediately after the previous call, we check the results and clean mocks
sinon.assert.called(request.Request);
request.Request.restore();

这样重写后开始工作:

return instance.doSomething().then(function() {
  sinon.assert.called(request.Request);
  request.Request.restore();
});

综上所述,instance.doSomething 执行了两个请求。

如果同步调用 Promise,request mock 会在 两个调用之后恢复。如果 promise 被异步调用,第一次调用成功但第二次调用失败,同时存根被恢复(第二次调用之前)。

我的问题是:

  • 有没有可能在我的机器和 CI 上,Mocha 使用不同的 Promise 实现?
  • 有没有办法强制 Mocha 实现承诺?
  • 也许更改后的 Promise 来自代码中的其他地方?

所有这一切看起来都很奇怪,尤其是代码使用bluebird 作为主要的 Promise 库...

【问题讨论】:

    标签: node.js testing promise mocha.js bluebird


    【解决方案1】:

    如果在承诺解决之前,不能保证您正在测试的内容处于正确的测试状态,那么您应该按照您在第二个 sn-p 中显示的那样编写测试。 是测试依赖于已解决承诺的条件的正确方法。您的初始代码有效的事实是由于运气。考虑以下代码:

    const assert = require("assert");
    const Promise = require("bluebird");
    
    let moo = "initial";
    
    function someFunc() {
        return Promise.resolve()
            .then(function () {
                moo = "modified";
            });
    }
    
    beforeEach(() => moo = "initial");
    
    it("test one", () => {
        someFunc();
        assert.equal(moo, "modified");
    });
    
    it("test two", () => {
        return someFunc().then(() => {
            assert.equal(moo, "modified");
        });
    });
    

    someFunc 中的承诺立即解决,但没关系。 test one 失败,因为我没有等待承诺。我使用 Bluebird 还是 Node 的股票 Promise 实现并不重要。

    在某些情况下test one 会通过,但这只是运气,因为承诺并不能保证它会起作用。这种运气可能会改变,如果:

    1. 您切换到不同的 Promise 实现。

    2. 您在不同的平台上运行。 Promise 实现必须与各种平台提供的协同工作。因此可能会因平台而异,这很好,只要它不违反规范即可。但是,您的初始代码所依赖的行为规范不保证,因此它可能无法在所有平台上维护。

    3. 您使用的 Promise 实现的新版本已发布,不再保持您所依赖的行为。

    有没有可能在我的机器和 CI 上,Mocha 使用不同的 Promise 实现?

    查看 Mocha 的代码,我没有看到 Mocha 实例化承诺的任何位置。它检测it 是否返回一个promise,并依赖于promise 提供的API,但它不会创建自己的promise。

    有没有办法强制 Mocha 实现承诺?

    见上文。它接收您返回的承诺,因此它使用您在测试套件中使用的任何实现。

    也许更改后的 Promise 来自代码中的另一个地方?

    不确定你的意思。

    【讨论】:

      猜你喜欢
      • 2021-07-16
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      相关资源
      最近更新 更多