Warm tip: This article is reproduced from serverfault.com, please click

node.js-使用Mocha Chai Sinon进行随机Nodejs项目的Node.js Express.js Mongodb Javascript单元测试

(node.js - Nodejs Expressjs Mongodb Javascript Unit Test Using Mocha Chai Sinon for random Nodejs Project)

发布于 2020-11-25 07:05:53

有人可以告诉我如何为该示例项目的功能homeDog进行“单元测试”吗?我有以下来自随机项目的示例函数,我希望尝试为其添加单元测试,同时我学习如何使用Mocha Chai Sinon进行单元测试,引用的示例随机Nodejs项目来自https://github.com/seanaharrison/ node-express-mongodb-example

我一直在努力对homeDog函数进行单元测试,但是随后我遇到了问题,有人可以向我展示如何对homeDog函数进行单元测试的工作单元测试,以便我有一个起点吗?

这是我尝试但失败的。

what_i_had_done_but_failed

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'
            });
        }
    });
};
Questioner
Tan Wll
Viewed
11
199 2020-11-27 15:21:44

因为你需要一个“模拟数据库”,但是你没有在代码中使用它(我认为),所以我将尝试说明如何使用来测试API项目mock database

那就是:你不需要真正的数据库来测试你的API,你需要在每次测试执行时创建并关闭“内存数据库”。

首先,安装模拟依赖项,例如mongo-mockmongodb-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与现有的“模拟数据库”进行比较。