我刚开始用mocha,sinon和mongoose。
我在mongoose中有一个模式/模型:
var PersonSchema = new Schema({
name: { type: String, required: true },
employer: { type: Schema.Types.ObjectId, ref: 'Employer' }
});
mongoose.model('Person', PersonSchema);
var EmployerSchema = new Schema({
name: { type: String, required: true }
});
mongoose.model('Employer', EmployerSchema);
我有一个方法来帮助查询:
var getPersonById = function(id, callback) {
Person.findById(id, function(err, person) {
if (err) return callback(err);
// this really could call any mongoose function
// question is if I mocked the person object is there a good
// way to mock the populate method that mongoose provides
person.populate('employer', function(err, populatedPerson) {
return callback(err, populatedPerson);
});
});
}
我成功地模拟了对数据库的查询: var mockedPerson = { _id:' 1', 名称:' test' };
sinon.mock(PersonModel)
.expects('findById')
.withArgs("1")
.yields(null, mockedPerson});
然后在我的测试中调用我的函数:
getPersonById("1", function(err, person) {
// person is: {name: 'test'};
});
但是我的测试失败了,因为当我嘲笑从findById调用返回的person对象时,我并没有真正拥有猫鼬对象。意味着它没有填充方法。
确定我能做到这一点:var mockedPerson = {
_id: '1',
name: 'test',
employer: '12',
populate: function() {
return {
name: 'test',
employer: {
name: 'Apple'
}
}
}
};
以这种方式模拟填充方法似乎很苛刻。我真的试图用模拟DB调用来测试getPersonById方法,但我仍然想验证我是用正确的参数调用populate并且可能用sinon模拟返回。
这可能吗?我尝试过类似的东西,但你不能存根不存在的方法。
var mockedPerson = {
_id: '1',
name: 'test',
employer: '12'
};
var stub = sinon.stub(mockedPerson, 'populate')
.withArgs('employer')
.yields(null, { name: 'test', employer: 'apple'});