NodeJS 如何在mocha中测试非等待异步函数调用?

lnlaulya  于 2023-03-01  发布在  Node.js
关注(0)|答案(1)|浏览(141)

我想为一个预约服务编写一个摩卡测试套件,这个预约服务调用一个异步运行的postReservation服务?如何测试postReservation服务是否被调用?

async function bookReservation(...){
    await bookReservationForUser(...);
    postReservation(...);
}
async function postReservation(...){
    await DoSomeThing();
    await DoSomeOtherThing();
}

有比这更好的方法吗?
摩卡测试套件:
一个二个一个一个

lpwwtiir

lpwwtiir1#

你对测试的想法是正确的,它主要归结为实现,因为它取决于Assert库和代码的结构。
本质上,你可以使用spystub来监视postReservation,如果你不关心返回值,那么spy就很好用。
在下面使用您的代码的测试示例中,每个模块都有来自wait的短暂延迟。测试调用Module CModule C调用Module BModule A。测试检查B/A是否都通过C调用。
这里有一个working sandbox来进行测试。

索引测试js

import sinon from "sinon";
import referee from "@sinonjs/referee";
import moduleC from "./moduleC.js";
import moduleB from "./moduleB.js";
import moduleA from "./moduleA.js";

const assert = referee.assert;

describe("book a reservation", () => {
  it("both spys should be called", async () => {
    const spy1 = sinon.spy(moduleA, "postReservation");
    const spy2 = sinon.spy(moduleB, "bookReservationForUser");
    await moduleC.bookReservation();
    assert(spy1.called);
    assert(spy2.called);
  }).timeout(15000);
});

等等,js

const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
export default wait;

模块A.js

import wait from "./wait.js";

async function postReservation() {
  console.log("--- postReservation ---");
  return wait(1500);
}

export default {
  postReservation,
};

模块B.js

import wait from "./wait.js";

async function bookReservationForUser() {
  console.log("--- bookReservationForUser ---");
  return wait(1500);
}

export default {
  bookReservationForUser,
};

模块C.js

import wait from "./wait.js";
import moduleB from "./moduleB.js";
import moduleA from "./moduleA.js";

async function bookReservation() {
  console.log("--- bookReservation ---");
  await wait(2000);
  await moduleB.bookReservationForUser();
  return moduleA.postReservation();
}

export default {
  bookReservation,
};

如果你使用的是CJS而不是ESM,那么你构建模块、示例化模块以及在测试中导入模块的方式会稍有变化。

相关问题