我是单元测试新手,正在使用 Mocha、Sinon 和 Chai 测试 NodeJs 代码。问题是我对 stub.calledWith() 的期望在它是一个对象时总是失败,即使测试错误显示两个在语法上相同的对象。
我正在使用 Sinon 存根猫鼬模型的保存方法,并检查是否使用正确的详细信息调用了该存根。
我正在测试的功能:
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()
是一个实例方法,所以它是在没有参数的情况下调用的。这一定与诗浓断言有关,它显示了两次期望,而不是期望和现实。
我真正需要做的是弄清楚如何对Model
构造函数进行存根/监视,以确保使用正确的参数调用它。如果有人知道该怎么做,我真的可以在帮助下做。