sinon否认一个被称为存根的存根

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

我正在使用sinon来存储函数res.status,res.status在下面的单元测试中被调用,一次传递而另一次失败,我甚至调试并逐行进行并且看到函数被调用但是sinon失败并且说函数没被叫。

这是我正在测试的控制器(ActivityController.js)

exports.findActivity = (req, res) => {
  ActivityService.findActivity(req.params.id, req.user).then(result => {
    res.status(200).json({result: result})
  }).catch(err => {
    res.status(500).json({msg: err.message})
  })
}

这是单元测试,第一次测试通过罚款,第二次测试没有

    it('should return Activity obj with status 200', async () => {
      expectedResult = activity
      sinon.stub(ActivityService, 'findActivity').resolves(expectedResult)
      await ActivityController.findActivity(req, res)
      sinon.assert.calledWith(ActivityService.findActivity)
      expect(res.status.calledOnce).to.equal(true)
      sinon.assert.calledWith(res.status, 200)
    })
    it('should return status 500 on server error', async () => {
      sinon.stub(ActivityService, 'findActivity').rejects()
      await ActivityController.findActivity(req, res)
      sinon.assert.calledWith(ActivityService.findActivity, req.params.id, req.user)
      expect(res.status.calledOnce).to.equal(true)
      sinon.assert.calledWith(res.status, 500)
    })

我对第二次单元测试进行了调试,看到ActivityController通过catch并调用res.status(500)但单元测试在res.status.calledOnce失败了

node.js unit-testing express sinon
2个回答
0
投票

您是否在每次测试之间重置res.status存根? res.calledOnce可能不是真的,因为它可能不止一次被召唤。


0
投票

似乎expect(res.status.calledOnce).to.equal(true)在等待sinon.assert.calledWith之前立即被召唤。

await之前把sinon.assert解决问题。

所以正确的代码是

  it('should return status 500 on server error', async () => {
      sinon.stub(ActivityService, 'findActivity').rejects()
      await ActivityController.findActivity(req, res)
      await sinon.assert.calledWith(ActivityService.findActivity, req.params.id, req.user)
      expect(res.status.calledOnce).to.equal(true)
      sinon.assert.calledWith(res.status, 500)
    })
© www.soinside.com 2019 - 2024. All rights reserved.