如何模仿猫鼬?

时间:2017-07-24 15:39:36

标签: node.js mongoose mocha

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

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

我只需要在测试中进行模拟,而且我不需要测试mongoose,例如:

Model.find()

我需要测试api(路线) 比如链接

P.S。 mock-mongoose不使用promises :(

3 个答案:

答案 0 :(得分:2)

我找到了解决方案 - 使用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;

答案 1 :(得分:0)

有许多库,例如嘲讽和嘲讽。我尝试了其中的几种,并找到了一个非常简单的解决方案,没有其他依赖项。

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

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

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

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

答案 2 :(得分:-2)

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 {}
    };