我對單元測驗非常陌生,我正在嘗試對從我的資料庫讀取的函式撰寫單元測驗,但是由于讀取是異步的,因此在我的 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 是否正確?
uj5u.com熱心網友回復:
單元測驗的主要目標是僅測驗 1 層邏輯,例如您呈現的函式本身。其他所有東西都必須是模擬的,否則它是您需要的集成測驗,而不是單元測驗。
在這種情況下,您嘗試在資料庫上實際運行查詢,但它實際上并沒有啟動和作業,所以您得到的是未定義的。
我建議如下:
- 如果您想實際查詢資料庫,請在實際作業的地方運行集成測驗。集成測驗正在加載整個應用程式以測驗所有組件之間的互動。
- 要完成單元測驗本身,您應該模擬資料庫,例如它回傳您期望它回傳的內容,因此只有函式中的那 5 行實際運行。
uj5u.com熱心網友回復:
你有兩種方法可以做到這一點。
您可以在測驗中等待您的功能:
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();
});
});
但無論哪種情況,您的函式都應該回傳一個值,您可以在該值上進行斷言。在那里,numberUsers永遠不會宣告并且仍然會是undefined。
編輯:除非在globals物件中注冊,因為不使用let,const或var. 這是您可能不想做的事情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/451914.html
