如何让摩卡单元测试等待异步变量

How to make Mocha unit test wait for async variable

我是单元测试的新手,我正在尝试对从我的数据库读取的函数编写单元测试,但由于读取是异步的,所以在我的 Mocha 单元测试中该值始终未定义。如何对异步声明的变量进行断言?

单元测试:

const homeController = require('../controllers/homeController');

describe('Testing home_get function', function () {
  it ('should render the home page', function () {
    const req = {};
    homeController.home_get(req, null, () =>  {});
    console.log("numberUsers", numberUsers);
    assert.ok(numberUsers > 0);
  });
});

我要测试的功能:

module.exports.home_get = async (req, res) => {
    requestTime = Date.now();
    numberUsers = await User.countDocuments({});
    numberViewers = await Viewer.countDocuments({});
    numberAccreditors = await Accreditor.countDocuments({});
    
    res.status('200').render('home', {numberUsers: numberUsers, numberViewers: numberViewers, numberAccreditors: numberAccreditors});
};

当我对 requestTime 变量执行断言语句时,它按预期工作,但是当我对异步变量执行断言时,值始终未定义,我不确定如何让单元测试对这些异步变量起作用,还有....当你渲染主页时,你会如何进行单元测试来检查 res.status 是否正确?

您有两种方法可以做到这一点。

您可以在测试中等待您的功能:

  it ('should render the home page', async function () {
    const req = {};
    await homeController.home_get(req, null, () =>  {});
    console.log("numberUsers", numberUsers);
    assert.ok(numberUsers > 0);
  });

或使用测试回调函数:

  it ('should render the home page', function (done) {
    const req = {};
    homeController.home_get(req, null, () =>  {}).then(() => {
      console.log("numberUsers", numberUsers);
      assert.ok(numberUsers > 0);
      done();
    });
  });

但在任何一种情况下,您的函数都应该 return 一个您可以对其进行断言的值。在那里,numberUsers 永远不会被声明,并且仍然是 undefined.

编辑:除非因为未使用 letconstvar 而在 globals 对象中注册。这可能是您不想做的事情。

单元测试的主要目标是仅测试一层逻辑,例如您提供的功能本身。其他一切都必须是模拟,否则它是您需要的集成测试而不是单元测试。

在这种情况下,您实际上是在尝试 运行 数据库查询,但它实际上并没有启动和工作,所以您得到的结果是不确定的。

我建议如下:

  1. 如果您想实际查询数据库,运行 一个集成测试而不是它实际工作的地方。集成测试正在加载整个应用程序以测试所有组件之间的交互。
  2. 要完成单元测试本身,您应该模拟数据库,例如它 return 是您期望的 return,所以只有函数中的那 5 行实际上是 运行宁.