摩卡间谍返回callCount 0

问题描述 投票:0回答:1

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

我的控制器看起来像这样:

{
   get model() { return schema},
   async findUser(data) {
      const data = await this.model.find({ id: data.id });
      return data;
   }
}

在我的mocha测试中,我使用Sinon存根返回模型并找到如下函数:

sinon.stub(controller, 'model').get(() => ({
    find: () => ({ username: 'asdf' })
}));

我的测试按预期工作。现在我想测试看看我的find方法id是否被调用一次并且参数传递给它。为此,我添加了以下代码

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

这应该返回true,因为调用了spyFind并返回了预期的模拟值。但是当我调试时,spyFind对象说isCalled'false'。有人能帮助我理解我做错了什么吗?

node.js mocha sinon
1个回答
1
投票

设计存根的方式是每次调用controller.model时都会返回一个新对象。结果:

controller.model === controller.model // false

所以,当你试图窥探findcontroller.model属性:

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

Sinon抓住了controller.model和stubs 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
© www.soinside.com 2019 - 2024. All rights reserved.