测试Mongoose Node.JS应用程序

Ben*_*eys 15 testing unit-testing mongoose node.js

我正在尝试为我的Node应用程序的部分内容编写单元测试.我正在使用Mongoose作为我的ORM.

我搜索了一堆如何用Mongoose和Node进行测试但没有任何东西.解决方案/框架似乎都是全栈或没有提到嘲弄的东西.

有没有办法可以模拟我的Mongoose数据库,所以我可以在测试中返回静态数据?我宁愿不必设置测试数据库并用每个单元测试的数据填充它.

有人遇到过这种情况么?

kez*_*eza 8

我也去寻找答案,最后来到这里.这就是我做的:

我开始使用mockery来模拟我的模型所在的模块.然后创建我自己的模拟模块,每个模型都将它作为属性挂起.这些属性包装了真实模型(因此存在被测代码的子属性).然后我重写我想要像保存一样操作测试的方法.这具有嘲弄能够撤消嘲弄的优点.

但...

我不太关心撤消模拟为每个模型编写包装器属性.所以现在我只需要我的模块并覆盖我想要操作的函数.如果它成为问题,我可能会在单独的进程中运行测试.

在我测试的安排部分:

// mock out database saves
var db = require("../../schema");
db.Model1.prototype.save = function(callback) { 
    console.log("in the mock");
    callback();
};
db.Model2.prototype.save = function(callback) {
    console.log("in the mock");
    callback("mock staged an error for testing purposes");
};
Run Code Online (Sandbox Code Playgroud)


iva*_*rni 6

我通过稍微构造我的代码解决了这个问题.我将所有与mongoose相关的东西保存在单独的类中,其中包含"save","find","delete"等API,没有其他类可以直接访问数据库.然后我只是在依赖数据的测试中模拟那些.

我做了类似于返回的实际对象.对于我在mongoose中的每个模型,我有一个相应的类来包装它并为字段提供访问方法.这些也很容易被嘲笑.


Gil*_*eri 6

另外值得一提的是:
mockgoose - 用于测试目的的模拟 Mongoose的内存数据库.
monckoose - 类似,但采取不同的方法(实现一个假的驱动程序).Monckoose似乎在2015年3月未发表.