gpt4 book ai didi

node.js - 不同的 Mocha 行为 - 异步/同步 promise

转载 作者:行者123 更新时间:2023-11-28 21:24:04 25 4
gpt4 key购买 nike

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

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

// 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 模拟将在两次调用之后 恢复。如果 promise 被异步调用,第一次调用成功但第二次失败,因为同时 stub 被恢复(第二次调用之前)。

我的问题是:

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

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

最佳答案

如果在 promise 得到解决之前无法保证您正在测试的内容处于正确的测试状态,那么您应该按照第二个代码段中所示的那样编写测试。 是测试依赖于已解决 promise 的条件的正确方法。您的初始代码之所以有效,是因为运气。考虑以下代码:

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 中的 promise 会立即 resolve,但这并不重要。 test one 失败,因为我没有等待 promise 。我使用 Bluebird 还是 Node 的常用 Promise 实现并不重要。

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

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

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

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

Is is possible that on my machine and CI, Mocha uses different promise implementations?

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

Is there a way to force promise implementation for Mocha?

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

Maybe the changed Promise comes from another place in the code?

不确定你的意思。

关于node.js - 不同的 Mocha 行为 - 异步/同步 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45081287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com