模拟对象看起来像猫鼬对象

时间:2016-01-08 03:01:44

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

我刚开始用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'});

0 个答案:

没有答案