如何模拟猫鼬?

Posted

技术标签:

【中文标题】如何模拟猫鼬?【英文标题】:How to mock mongoose? 【发布时间】:2017-12-30 06:50:12 【问题描述】:

我应该在没有 mongodb 的 node+express+mongoose+swagger 应用程序上运行测试, 我需要模块来模拟猫鼬(仅用于测试)。 我尝试了 mock-mongoose 和 mockgoose,但我有错误:( 也许我失败了..或者这个模块不能帮助我 我希望你的想法!

我创建了示例骨架: https://github.com/miroslav-grabinskiy/swagger-server-mock-tested

我只需要在测试中模拟,我不需要测试猫鼬,比如:

Model.find()

我需要测试 api(路由) 喜欢在链接中

附:模拟猫鼬不使用承诺:(

【问题讨论】:

【参考方案1】:

我找到了解决方案 - 使用 mockgoose:

"use strict";

const config = require(appRoot + '/config');
const Mongoose = require('mongoose').Mongoose;
const mongoose = new Mongoose();

const DB_NAME = "rbTest";
const DOCKER_MONGODB_URI = "mongodb://mongo:27017/" + DB_NAME;
const LOCAL_MONGODB_URI = "mongodb://localhost:27017/" + DB_NAME + "?socketTimeoutMS=120000";
const myMongo = process.env.DOCKER ? DOCKER_MONGODB_URI : LOCAL_MONGODB_URI;

mongoose.Promise = global.Promise;

if (process.env.NODE_ENV === 'testing') 
  const Mockgoose = require('mockgoose').Mockgoose;
  const mockgoose = new Mockgoose(mongoose);

  mockgoose.prepareStorage().then(function() 
    mongoose.connect(myMongo, function(err) 
      console.log('connected');
    );
  );
 else 
  mongoose.connect(myMongo, config.get('mongoose:options'));


module.exports = mongoose;

【讨论】:

只是想在这里添加一个简短的评论,即当前版本的 Mockgoose (7.3.5) 存在安全漏洞,并且该项目似乎已被放弃,八个月没有动过。跨度> 我可以确认,这个项目不再工作了。目前正在寻找替代品,如果我发现任何会在这里发布 @DrunkDevKek 猫鼬模拟的任何替代品?【参考方案2】:

有几个库,例如 mockgoose 和 mockingoose。我已经尝试了其中的几个,并找到了一个非常简单的解决方案,没有额外的依赖项。

我有一个模型 Foo,我将它添加到控制器文件中的导出中:

//controller.js file
const Foo = mongoose.model('foo_collection', fooSchema);
exports.Foo = Foo;
exports.getFoo = query => Foo.find(query);

在单元测试中(例如,我使用 Chai),我导入模型,并覆盖“find”方法:

//test-controller.js file
describe('some test', () => 
    beforeEach(() => 
        Foo.find = async () => [foo: "bar"];
    );

    it('should return foo bar', async () => 
        const fooBar = await controller.getFoo();
        assert(fooBar.foo === "bar");
    );
);

【讨论】:

【参考方案3】:

如Jest documentation 中所述,我在我的项目根目录中创建了一个__mocks__ 文件夹。在 mocks 文件夹中创建了一个文件 mongoose.js

__mocks__/mongoose.js


    module.exports = 
      connect: jest.fn(),
      connection: 
        on: jest.fn(),
        once: jest.fn()
      ,
      model: jest.fn(),
      Schema: class Schema 
    ;

【讨论】:

以上是关于如何模拟猫鼬?的主要内容,如果未能解决你的问题,请参考以下文章

Mockgoose:如何模拟猫鼬中的错误?

NestJS如何在单元测试中创建新的猫鼬模型?

使用 NestJS 测试猫鼬模型

如何模拟这个以继续 async.each() 调用

用 sinon 模拟/存根猫鼬 findById

如何在 Service 构造函数中对 Controller 进行单元测试和模拟 @InjectModel