有人可以告诉我如何为该示例项目的功能homeDog进行“单元测试”吗?我有以下来自随机项目的示例函数,我希望尝试为其添加单元测试,同时我学习如何使用Mocha Chai Sinon进行单元测试,引用的示例随机Nodejs项目来自https://github.com/seanaharrison/ node-express-mongodb-example。
我一直在努力对homeDog函数进行单元测试,但是随后我遇到了问题,有人可以向我展示如何对homeDog函数进行单元测试的工作单元测试,以便我有一个起点吗?
这是我尝试但失败的。
exports.homeDog = function(req, res) {
var db = req.db;
var collection = db.collection('dogs');
collection.find().toArray(function(err, dogsArray) {
if (dogsArray) {
res.render('index', {
title: 'Dogs',
path: req.path,
dogs: dogsArray
});
}
else {
res.render('index', {
title: 'No Dogs Found'
});
}
});
};
因为你需要一个“模拟数据库”,但是你没有在代码中使用它(我认为),所以我将尝试说明如何使用来测试API项目mock database
。
那就是:你不需要真正的数据库来测试你的API,你需要在每次测试执行时创建并关闭“内存数据库”。
首先,安装模拟依赖项,例如mongo-mock,mongodb-memory-server或任何你想要的东西。
我个人使用mongodb-memory-server
。
因此,按照文档操作,你可以设置你的项目。我的mockDB.js
文件与处于同一级别test.js
。
mockDB.js
文件应包含以下内容(如果你使用其他软件包,则此代码可能会更改。):
const { MongoMemoryServer } = require('mongodb-memory-server');
const mongod = new MongoMemoryServer();
module.exports.connect = async () => {
const uri = await mongod.getUri();
const mongooseOpts = {
useNewUrlParser: true,
useFindAndModify: false,
useUnifiedTopology: true
};
await mongoose.connect(uri, mongooseOpts);
}
然后,你将拥有一个mock DB
将在其中初始化和连接的文件。此时,mymongo DB
已初始化。我正在使用,mongoose
但允许使用另一个选项。
控制器(homeDog
在这种情况下,我认为)文件在这里无关紧要,因为你正在测试控制器,因此代码必须与生产环境中的相同。控制器是要测试的代码,因此不应出于测试目的对其进行修改。
最后一个文件是test.js
。在此文件中,你必须导入mockDB.js
文件并启动数据库。
const mockDB = require('./mockDB');
...
before(async () => await mockDB.connect());
这样,你可以执行测试,控制器将执行对的查询memory database
。另外,你可以使用文件mockDB.js
来实现辅助查询。
例如,要从字段中获取特定值,你可以创建类似
module.exports.findValueById(id) => {
//return result
}
并在你的测试文件中调用以下模块:
var idFound = mockDB.findValueById(id)
例如,使用此功能,你可以在插入文档后查询数据库,并检查收集是否正常。或检查是否已正确进行更新或进行任何所需的更新。
如果你的函数是a GET
,则只需将返回的数据homeDog
与现有的“模拟数据库”进行比较。
我的意图是,如果我通过询问如何模拟数据库而弄错了,请创建对不起的单元测试。因为我在哪里看到函数都与mongodb有关。但是我无法测试它是否孤立。我在想如何为homeDog函数创建单元测试。感谢您对mongodb模拟的参考。
稍后,我将在添加测试案例示例的同时更新我的答案。但是
homeDog()
我认为这是一个在哪里使用数据库连接的端点。因此,我想您将需要这部分。