簡體   English   中英

為什么 Mocha 忽略異步函數調用?

[英]Why is Mocha ignoring asynchronous function calls?

我正在用 Mocha 和 Chai 編寫自動化集成測試。 這是我正在測試的代碼的簡化版本:

exports.doSomething = async function (req, res) {
  return executeRequest(req.body)
    .then((response) => {
      console.log("then running");
      res.status(200).send(response);
    })
    .catch((err) => {
      console.error(err);
      res.status(500).send(err);
    }
}

這是我的測試文件的樣子:

const { doSomething } = require("../../index");
const { assert } = require("chai");
const { stub } = require("sinon");

const req = { body: { *data* } };
const res = {
  status: stub().returnsThis(),
  send: stub().returnsThis(),
};

it(`Please work`, async () => {
  await doSomething(req, res);
}

發生這種情況時,既不會輸入.then塊,也不會輸入.catchconsole.log不會運行; res.sendres.status永遠不會被調用。

另一個有趣的注意事項:如果我從測試調用中刪除async並將doSomething()的結果保存到變量中,它將顯示為一個承諾。 當我包含async時, doSomething的結果是未定義的。

我是 Mocha 的新手,不知道為什么它似乎忽略了代碼的異步性。

您的doSomething實現已損壞, async函數返回的承諾將立即履行 - 在executeRequest完成之前。 你應該寫

exports.doSomething = function (req, res) {
  return executeRequest(req.body)
//^^^^^^
    .then((response) => {
      console.log("then running");
      res.status(200).send(response);
    })
    .catch((err) => {
      console.error(err);
      res.status(500).send(err);
    })
}

或者

exports.doSomething = async function (req, res) {
  try {
    const response = await executeRequest(req.body);
//                   ^^^^^
    console.log("then running");
    res.status(200).send(response);
  } catch(err) {
    console.error(err);
    res.status(500).send(err);
  }
}

只有這樣您的測試才能正確await doSomething(req, res)調用,並且 mocha 不會過早終止該進程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM