簡體   English   中英

如何讓摩卡單元測試等待異步變量

[英]How to make Mocha unit test wait for async variable

我是單元測試的新手,我正在嘗試對從我的數據庫讀取的 function 編寫單元測試,但是因為讀取是異步的,所以在我的 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);
  });
});

Function 我正在嘗試測試:

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 變量上執行 assert 語句時,它按預期工作,但是當我在異步變量上執行時,值始終未定義,我不確定如何讓單元測試在這些異步變量上工作,也... . 然后你會如何做一個單元測試來檢查 res.status 在你渲染回家時是否正確?

你有兩種方法可以做到這一點。

您可以在測試中等待您的 function:

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

或使用測試回調 function:

  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();
    });
  });

但是在任何一種情況下,您的 function 都應該返回一個您可以對其進行斷言的值。 在那里, numberUsers從未被聲明並且仍然是undefined

編輯:除非在globals object 中注冊,因為不使用letconstvar 這是您可能不想做的事情。

單元測試的主要目標是僅測試一層邏輯,例如您提供的 function 本身。 其他一切都必須是模擬,否則它是您需要的集成測試而不是單元測試。

在這種情況下,您試圖在數據庫上實際運行查詢,但它實際上並沒有啟動和工作,所以您得到的是未定義的。

我建議如下:

  1. 如果您想實際查詢數據庫,請運行集成測試,而不是在它實際工作的地方運行。 集成測試正在加載整個應用程序以測試所有組件之間的交互。
  2. 要完成單元測試本身,您應該模擬數據庫,例如它返回您期望返回的內容,因此實際上只有 function 中的那 5 行在運行。

暫無
暫無

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

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