【发布时间】: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