2011-09-25 38 views
15

我想为我的Node应用的部分编写单元测试。我为我的ORM使用了Mongoose。测试Mongoose Node.JS应用

我已经搜索了一堆如何做与猫鼬和节点测试,但没有带任何东西。这些解决方案/框架似乎都是全面的,或者没有提到嘲讽的东西。

有没有一种方法可以模拟我的Mongoose数据库,这样我就可以在我的测试中返回静态数据?我宁愿不必为每个单元测试设置测试数据库并填写数据。

有没有其他人遇到过这个?

回答

6

我通过构建一些代码解决了这个问题。我将所有与猫鼬相关的东西放在单独的类中,并使用“保存”,“查找”,“删除”等API,并且没有其他类直接访问数据库。然后,我简单地嘲笑那些依赖数据的测试。

我做了与返回的实际对象类似的东西。对于我在猫鼬中使用的每个模型,我都有一个相应的类来包装它,并为字段提供访问方法。那些也很容易被嘲笑。

+11

您是否有这样的代码示例? – bouncingHippo

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"); 
}; 
+0

你是否使用NodeJS做到这一点? – bouncingHippo

+0

'schema.js'中有什么? – Michelle

+0

@Michelle最有可能的猫鼬纲要定义 – sshow

6

另外值得一提的是:
mockgoose - 在内存中的DB嘲笑猫鼬,用于测试目的。
monckoose - 类似的,但采取了不同的方法(实现一个假的驱动程序)。 Monckoose似乎在2015年3月未发布。

+0

你的第二个链接已经死了,它似乎已经被取消发布。 –

+0

@KevinB谢谢,更新 –