【问题标题】:Mocking mongoose using Sinon使用 Sinon 模拟猫鼬
【发布时间】:2016-04-09 06:33:18
【问题描述】:

是否可以模拟在非规范文件中使用的 mongoose 方法?我希望能够以类似于此示例的方式模拟操作:

模型/user.js:

userSchema.statics.SetUsername = function (userId, username, callback) {
        instance.findOneAndUpdate({ UserId: userId },
            { $set: { Name: username } },
            { new: true },
            function (error, doc) {
                if (error) {
                    logger.error(error);
                    callback({ error: error });
                } else {
                    callback(doc);
                }
            })
        }

规范/userSpec.js:

describe("User module", function () {
var User = require('../models/User');
var UserMock = sinon.mock(User);
UserMock
.expects('findOneAndUpdate').withArgs( {UserId: 9 },{ $set: { Name: 'Lol'}},{ new: true })
.yields(null, {UserId: 9, Username: 'Lol'});

describe("POST /setUsername", function () {
    it("returns status code 200", function (done) {
        request.post({
            url: setUsernameUrl,
            qs: { userId: '9', username: 'Lol' }
        }, function (error, response, body) {
            expect(response.statusCode).toBe(200);
            done();
        });
    });
});

这不起作用,SetUsername 函数中的findOneAndUpdate 不会被模拟。

如果这通常是个坏主意,您能否提出另一种方法?

@编辑: 我想我明白为什么这没有意义。现在我正在寻找一种测试唯一猫鼬方法的方法,通过从测试中调用它们,而不是通过向测试服务器发送请求。测试如下所示:

it("returns document", function (done) {
            User.SetUsername(9, 'Lol', function (result) {
                expect(result).not.toBeNull();
                expect(result.UserId).toBe(9);
                expect(result.Username).toBe('Lol');
                done();
            })
});

【问题讨论】:

    标签: node.js mongodb unit-testing mongoose sinon


    【解决方案1】:

    嗯,所以我只是忘记模拟另一个使用数据库连接的方法(这会导致错误:超时。这个答案适用于问题的编辑版本。

    【讨论】:

      猜你喜欢
      • 2014-04-02
      • 2017-04-26
      • 2017-12-30
      • 2013-09-13
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      相关资源
      最近更新 更多