Node.js 摩卡间谍返回呼叫计数0

Node.js 摩卡间谍返回呼叫计数0,node.js,mocha.js,sinon,Node.js,Mocha.js,Sinon,我在node env中使用mocha、chai和sinon进行单元测试。我需要测试一个场景,在这个场景中,它调用服务来获取数据并返回数据 我的控制器如下所示: { get model() { return schema}, async findUser(data) { const data = await this.model.find({ id: data.id }); return data; } } sinon.stub(controller,

我在node env中使用mocha、chai和sinon进行单元测试。我需要测试一个场景,在这个场景中,它调用服务来获取数据并返回数据

我的控制器如下所示:

{
   get model() { return schema},
   async findUser(data) {
      const data = await this.model.find({ id: data.id });
      return data;
   }
}
sinon.stub(controller, 'model').get(() => ({
    find: () => ({ username: 'asdf' })
}));
在我的mocha测试中,我使用Sinon存根返回模型,并找到如下函数:

{
   get model() { return schema},
   async findUser(data) {
      const data = await this.model.find({ id: data.id });
      return data;
   }
}
sinon.stub(controller, 'model').get(() => ({
    find: () => ({ username: 'asdf' })
}));
我的测试按预期进行。现在我想测试find方法id是否调用过一次,以及传递给它的参数。为此,我添加了以下代码

const spyFind = sinon.spy(controller.model, 'find');
assert.isTrue(spyFind.calledOnce);

这应该返回true,因为调用了spyFind,并且它返回了预期的模拟值。但当我调试时,spyFind对象会显示为“false”。有人能帮我理解我做错了什么吗?

按照存根的设计方式,每次调用controller.model时,它都会返回一个新对象。因此:

controller.model === controller.model // false
因此,当您尝试监视
controller.model
find
属性时:

const spyFind = sinon.spy(controller.model, 'find');
Sinon获取控制器返回的对象。model并在该对象上存根
find
。下次调用
controller.model
,例如在测试中,您将从
controller.model
获得一个未被监视的新对象。因此,原来的间谍从未被称为

我认为更好的方法是提供一个由
find()
返回的单存根,然后您可以判断存根是否被调用:

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

不清楚
控制器所指的方法是什么。你的意思是
constspyfind=sinon.spy(controller.model,'find')?哦,是的,更新了。它是
控制器。型号