【问题标题】:Testing Mongoose Node.JS app测试 Mongoose Node.JS 应用程序
【发布时间】:2011-11-24 13:42:49
【问题描述】:

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

我搜索了很多关于如何使用 Mongoose 和 Node 进行测试的方法,但没有提供任何东西。解决方案/框架似乎都是全栈的,或者没有提到嘲笑的东西。

有没有一种方法可以模拟我的 Mongoose DB,以便我可以在测试中返回静态数据?我宁愿不必建立一个测试数据库并为每个单元测试填充数据。

有没有其他人遇到过这种情况?

【问题讨论】:

    标签: unit-testing testing node.js mongoose


    【解决方案1】:

    我也去寻找答案,结果到了这里。这就是我所做的:

    我开始使用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");
    };
    

    【讨论】:

    • 你是用 NodeJS 做的吗?
    • schema.js 中有什么内容?
    • @Michelle 很可能是 Mongoose 模式定义
    【解决方案2】:

    我通过稍微结构化我的代码解决了这个问题。我将所有与猫鼬相关的东西保存在单独的类中,使用“save”、“find”、“delete”等 API,并且没有其他类可以直接访问数据库。然后我只是在依赖数据的测试中模拟那些。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 您的第二个链接已失效,似乎未发布。
      猜你喜欢
      • 2012-02-10
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 2012-02-06
      • 2018-11-05
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多