辛农否认了一个存根,即使被称为



我正在使用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)
    })

我调试了第二个单元测试,然后查看Activity Controller通过捕获量并致电res.status(500),但单位测试在res.status.calledOnce

中失败

您是否在每个测试之间重置res.status存根?res.calledOnce可能不是正确的,因为它可能被称为>一次。

看来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)
    })

最新更新