摩卡间谍 returns callCount 0
Mocha spies returns callCount 0
我在节点环境中使用 mocha、chai 和 sinon 进行单元测试。我需要测试一个场景,它调用服务来获取数据和 return 数据。
我的控制器是这样的:
{
get model() { return schema},
async findUser(data) {
const data = await this.model.find({ id: data.id });
return data;
}
}
在我的 mocha 测试中,我使用 Sinon 存根来 return 模型并找到类似这样的函数:
sinon.stub(controller, 'model').get(() => ({
find: () => ({ username: 'asdf' })
}));
我的测试按预期进行。现在我想测试一下我的查找方法 id 是否被调用一次以及传递给它的参数。为此,我添加了以下代码
const spyFind = sinon.spy(controller.model, 'find');
assert.isTrue(spyFind.calledOnce);
这应该 return 为真,因为调用了 spyFind 并且它 return 得到了预期的模拟值。但是当我调试时,spyFind 对象说 isCalled 'false'。有人可以帮助我了解我做错了什么吗?
您的存根的设计方式将在每次调用 controller.model
时 return 一个新对象。结果:
controller.model === controller.model // false
因此,当您尝试监视 controller.model
的 find
属性 时:
const spyFind = sinon.spy(controller.model, 'find');
Sinon 获取由 controller.model
编辑的对象 return 并在 那个 对象上存根 find
。下次您调用 controller.model
时,例如在您的测试中,您将从 controller.model
中获得一个未被监视的新对象。所以原来的间谍从来没有被调用过。
我认为更好的方法是提供一个由 find()
编辑的 return 的单一存根,然后您可以判断该存根是否被调用:
const sinon = require('sinon')
let controller = {
get model() { return schema},
async findUser(data) {
const data = await this.model.find({ id: data.id });
return data;
}
}
let findStub = sinon.stub()
findStub.returns({ username: 'asdf' })
sinon.stub(controller, 'model').get(() => ({
find: findStub
}));
console.log(controller.model.find()) // { username: 'asdf' }
console.log(findStub.calledOnce); // true
我在节点环境中使用 mocha、chai 和 sinon 进行单元测试。我需要测试一个场景,它调用服务来获取数据和 return 数据。
我的控制器是这样的:
{
get model() { return schema},
async findUser(data) {
const data = await this.model.find({ id: data.id });
return data;
}
}
在我的 mocha 测试中,我使用 Sinon 存根来 return 模型并找到类似这样的函数:
sinon.stub(controller, 'model').get(() => ({
find: () => ({ username: 'asdf' })
}));
我的测试按预期进行。现在我想测试一下我的查找方法 id 是否被调用一次以及传递给它的参数。为此,我添加了以下代码
const spyFind = sinon.spy(controller.model, 'find');
assert.isTrue(spyFind.calledOnce);
这应该 return 为真,因为调用了 spyFind 并且它 return 得到了预期的模拟值。但是当我调试时,spyFind 对象说 isCalled 'false'。有人可以帮助我了解我做错了什么吗?
您的存根的设计方式将在每次调用 controller.model
时 return 一个新对象。结果:
controller.model === controller.model // false
因此,当您尝试监视 controller.model
的 find
属性 时:
const spyFind = sinon.spy(controller.model, 'find');
Sinon 获取由 controller.model
编辑的对象 return 并在 那个 对象上存根 find
。下次您调用 controller.model
时,例如在您的测试中,您将从 controller.model
中获得一个未被监视的新对象。所以原来的间谍从来没有被调用过。
我认为更好的方法是提供一个由 find()
编辑的 return 的单一存根,然后您可以判断该存根是否被调用:
const sinon = require('sinon')
let controller = {
get model() { return schema},
async findUser(data) {
const data = await this.model.find({ id: data.id });
return data;
}
}
let findStub = sinon.stub()
findStub.returns({ username: 'asdf' })
sinon.stub(controller, 'model').get(() => ({
find: findStub
}));
console.log(controller.model.find()) // { username: 'asdf' }
console.log(findStub.calledOnce); // true