我是单元测试的新手,我正在使用Mocha,Sinon和Chai来测试NodeJs代码。问题是我对stub.calledWith()的期望总是在它是一个对象时失败,即使测试错误显示两个语法相同的对象。
我正在使用Sinon来存储一个mongoose模型的save方法,并检查是否使用正确的详细信息调用了这个存根。
我正在测试的功能:
async function createGroup(details) {
'use strict';
Logger.info(`create group called`);
const group = new UserGroup(this.formatGroup(details));
const result = await group.save();
Logger.verbose(`results of save: ${JSON.stringify(result)}`);
return result;
}
单元测试
describe('object creation', function () {
'use strict';
const saveStub = sinon.stub(UserGroup.prototype, 'save');
mongoose.Promise = Promise;
beforeEach(function (done) {
saveStub.reset();
return done();
});
after(function (done) {
saveStub.restore();
return done();
});
it('creates an object without error', async function () {
const correctDetailsIn = {
name: 'stark',
foo: 'bar',
bar: 'baz',
users: [{
email: 'eddard@stark.com',
firstName: 'eddard',
surname: 'stark'
}]
};
const persistableDetails = {
name: 'stark',
users: [{
email: 'eddard@stark.com',
firstName: 'eddard',
surname: 'stark'
}]
};
const expectedDetailsOut = {
_id: 'someidhere',
name: 'stark',
users: [{
email: 'eddard@stark.com',
firstName: 'eddard',
surname: 'stark'
}]
};
saveStub.resolves(expectedDetailsOut);
const res = await userGroupService.createGroup(correctDetailsIn);
expect(res).to.equal(expectedDetailsOut);
//I tried the four variations below.
expect(saveStub).to.be.calledWithMatch(persistableDetails);
//expect(saveStub).to.be.calledWith(persistableDetails);
//sinon.assert.calledWithMatch(saveStub, persistableDetails)
//sinon.assert.calledWith(saveStub, persistableDetails)
})
})
我尝试过的四种方法都失败了,但有一些变化:
AssertionError: expected save to have been called with arguments matching {
name: "stark",
users: [{ email: "eddard@stark.com", firstName: "eddard", surname: "stark" }]
}
{
name: "stark",
users: [{ email: "eddard@stark.com", firstName: "eddard", surname: "stark" }]
}
我觉得我错过了一些简单的工作。
修改
所以这很简单(而且非常明显,当然,我错过了它)Model.save()
是一个实例方法,因此它在没有参数的情况下被调用。它必须与Sinon断言有关,它显示期望两次,而不是期望和现实。
我真正需要做的是弄清楚如何对Model
构造函数进行存根/间谍,以确保使用正确的参数调用它。如果有人知道如何做到这一点,我可以尽力帮助。