sinon 拒绝调用存根,即使它已被调用
sinon deny a stub being called even though it was called
我正在使用 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 通过捕获和调用 res.status(500)
但单元测试在 res.status.calledOnce
中失败
您是否在每次测试之间重置 res.status
存根? res.calledOnce
可能不正确,因为它可能被称为 不止一次。
似乎在等待 sinon.assert.calledWith
之前立即调用了 expect(res.status.calledOnce).to.equal(true)
。
将 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)
})
我正在使用 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 通过捕获和调用 res.status(500)
但单元测试在 res.status.calledOnce
您是否在每次测试之间重置 res.status
存根? res.calledOnce
可能不正确,因为它可能被称为 不止一次。
似乎在等待 sinon.assert.calledWith
之前立即调用了 expect(res.status.calledOnce).to.equal(true)
。
将 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)
})