Node.js sinon拒绝调用存根,即使它已被调用

Node.js sinon拒绝调用存根,即使它已被调用,node.js,unit-testing,express,sinon,Node.js,Unit Testing,Express,Sinon,我正在使用sinon存根一个函数res.status,res.status在下面的两个单元测试中都被调用,一个通过,另一个失败,我甚至一行一行地进行调试,看到函数正在被调用,但sinon失败了,说函数没有被调用 这是我正在测试的控制器(ActivityController.js) 这里是单元测试,第一个测试通过了,但是第二个测试没有通过 it('should return Activity obj with status 200', async () => { expe

我正在使用sinon存根一个函数
res.status
,res.status在下面的两个单元测试中都被调用,一个通过,另一个失败,我甚至一行一行地进行调试,看到函数正在被调用,但sinon失败了,说函数没有被调用

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

这里是单元测试,第一个测试通过了,但是第二个测试没有通过

    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
您是否在每次测试之间重置
res.status
存根
res.calledOnce
可能不是真的,因为它可能被多次调用。

是否在每次测试之间重置
res.status
存根
res.calledOnce
可能不是真的,因为它可能被多次调用。

似乎在等待
sinon.assert.calledWith
之前立即调用了
expect(res.status.calledOnce).to.equal(true)

wait
放在
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)
    })
似乎在等待
sinon.assert.calledWith
之前立即调用了
expect(res.status.calledOnce).to.equal(true)

wait
放在
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)
    })

是的,在我运行的每个测试之后,
sinon.restore()
我还检查了res,callCount设置为0,这样sinon甚至没有在我运行的每个测试之后将其设置为calledUp
我还检查了res,callCount设置为0,因此sinon甚至没有将其设为called。您可以共享部分代码,说明如何在测试中定义
res
?您可以共享部分代码,说明如何在测试中定义
res