【问题标题】: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(路由) 喜欢在链接中

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

【问题讨论】:

    标签: node.js mongoose mocha.js


    【解决方案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 {}
          };
      
      

      【讨论】:

        猜你喜欢
        • 2016-04-09
        • 2016-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-20
        • 2014-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多