【发布时间】:2017-12-09 11:28:59
【问题描述】:
在过去的几个月里,我一直在使用 JavaScript 并使用 SinonJS 来存根一些行为。我设法让它工作,我已经存根了很多方法,一切都很好。
但我对诗乃如何在桌子底下工作仍有一些疑问。我想我说的是 Sinon,但这个问题可能适用于所有其他旨在模拟/存根/间谍的库。
过去几年我最常使用的语言是 Java。在 Java 中,我使用 Mockito 来模拟/存根依赖项和依赖项注入。我曾经导入类,用@Mock 注释字段并将这个模拟作为参数传递给被测类。我很容易看出我在做什么:模拟一个类并将模拟作为参数传递。
当我第一次开始使用 SinonJS 时,我看到了这样的事情:
moduleUnderTest.spec.js
const request = require('request')
describe('Some tests', () => {
let requestStub
beforeEach(() => {
requestStub = sinon.stub(request, 'get')
})
afterEach(() => {
request.get.restore()
})
it('A test case', (done) => {
const err = undefined
const res = { statusCode: 200 }
const body = undefined
requestStub
.withArgs("some_url")
.yields(err, res, body)
const moduleUnderTest = moduleUnderTest.someFunction()
// some assertions
})
})
moduleUnderTest.js
const request = require('request')
// some code
request
.get("some_url", requestParams, onResponse)
而且它有效。当我们运行测试时,实现中的request moduleUnderTest.js 调用了request 模块的存根版本。
我的问题是:为什么会这样?
当测试调用实现执行时,实现需要并使用request 模块。如果我们没有将存根对象作为参数传递(注入),Sinon(和其他模拟/存根/间谍库)如何设法使实现调用存根? Sinon 在测试执行期间替换整个request 模块(或其中的一部分),使存根通过require('request') 可用,然后在测试完成后恢复它?
我尝试遵循 Sinon repo 中 stub.js 代码中的逻辑,但我对 JavaScript 还不是很熟悉。
对不起,很长的帖子,如果这是一个愚蠢的问题,对不起。 :)
【问题讨论】:
标签: javascript unit-testing mocking sinon stub