Node.js 使用Sinon模拟猫鼬

Node.js 使用Sinon模拟猫鼬,node.js,mongodb,unit-testing,mongoose,sinon,Node.js,Mongodb,Unit Testing,Mongoose,Sinon,是否可以模拟非规范文件中使用的mongoose方法?我希望能够以类似于此示例的方式模拟操作: models/user.js: userSchema.statics.SetUsername = function (userId, username, callback) { instance.findOneAndUpdate({ UserId: userId }, { $set: { Name: username } }, { new:

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

models/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);
                }
            })
        }
spec/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
没有得到模拟

如果这通常是个坏主意,你能提出另一种方法吗

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

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();
            })
});

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