如何模拟猫鼬?
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
;
【讨论】:
以上是关于如何模拟猫鼬?的主要内容,如果未能解决你的问题,请参考以下文章