【发布时间】:2018-11-05 21:02:06
【问题描述】:
我是单元测试的新手。我的 Web API 项目是基于 node-express-mongoose 的 MVC。
我有一个conroller.js,如下:
const getComments = async (req, res) => {
let query = {};
try {
query = req.query.filter ? { email: new RegExp(`.*${req.query.filter}.*`, 'i') } : query;
const comments = await util.getComments(query);
return res.json(comments);
} catch (err) {
return res.status(500).send(`Internal server error: ${err}`);
}
};
控制器使用实现所有数据库操作的util.js函数:
const comments = require('../models/comments');
exports.getComments = (query) => {
try {
return comments.find(query).sort({ createdAt: -1 });
} catch (err) {
throw err;
}
};
如何使用 mocha & chai 创建单元测试?我是否必须使用 sinon 等创建假模拟?
【问题讨论】:
-
您不能对数据库调用进行单元测试,您只能测试它具有查询对象的 getComments 方法。因为你必须模拟数据库模型响应。您必须使用 mongo-in-memory (npmjs.com/package/mongo-in-memory) 并模拟 mongodb。
-
用sinon不能插入假数据?
-
我的意思是它是可能的,但它不是单元测试。实际上,您正在测试 cmets 模型而不是 getComments 方法本身。这意味着您不测试自己的代码,您测试的是已经由 mongoose 贡献者测试的 mongoose 模型。
-
我已经对虚拟内存数据库服务器的示例进行了更新,这对您的问题非常有帮助。但请确保模拟数据与您的模型中的数据相同
-
Tnx。我不明白为什么测试自己的方法不是“单元测试”?单元测试不包括数据库操作吗?如果代码中有类似的方法,应该如何进行单元测试?
标签: node.js unit-testing mongoose mocha.js sinon