Node.js 使用Sinon模拟猫鼬
是否可以模拟非规范文件中使用的mongoose方法?我希望能够以类似于此示例的方式模拟操作: models/user.js: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:
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();
})
});
嗯,所以我忘了模拟另一个使用数据库连接的方法(这会导致错误:超时)。这个答案适用于问题的编辑版本