我使用的是Mocha,Chai,Sinon,Proxyquire和Nock.
对于这个特定的测试场景(正在询问此问题),希望多次测试完全相同的URL,每个URL都在一个需要不同响应的单独测试中.
例如,没有商家Feed,1个商家Feed,还有2个商家Feed的响应.
现有的代码都可以工作,而且如果我单独运行测试,它们就会通过.
但是,如果我在一个套件中使用Mocha一起运行它们就会失败.相信问题是Nock劫持了给定URL的全局http对象,并且每个测试(同时异步运行)都在竞争相同的全局响应引用.
在上面的场景中,使用1个商家的预设回复准备的回复正在被设置覆盖以回复2个商家等.
是否存在避免这种情况发生的机制,例如保证异步Mocha测试用例的串行执行(我认为这是默认行为).
Jam*_*ffy 11
为了回应你的观点2),你可以nock.cleanAll()用来清理所有准备好的nocks:
https://github.com/pgte/nock#cleanall
你可以将它放在一个afterEach块中,以确保在测试之间没有剩余的nock.
afterEach ->
nock.cleanAll()
Run Code Online (Sandbox Code Playgroud)
好的,这样可行(示例代码):
beforeEach(function (done) {
nock(apiUrl)
.get('/dfm/api/v1/feeds?all=false')
.reply(200, [
{'merchantId': 2, 'id': 2, 'disabled': false}
], { server: 'Apache-Coyote/1.1',
'set-cookie': [ 'JSESSIONID=513B77F04A3A3FCA7B0AE1E99B57F237; Path=/dfm/; HttpOnly' ],
'content-type': 'application/json;charset=UTF-8',
'transfer-encoding': 'chunked',
date: 'Thu, 03 Jul 2014 08:46:53 GMT' });
batchProcess = proxyquire('./batchProcess', {
'./errorHandler': errorHandler.stub,
'./batchTask': batchTask.stub
});
winston.info('single valid feed beforeEach completed');
done();
});
Run Code Online (Sandbox Code Playgroud)
有很多复杂的因素.有两点需要注意:
1).我有异步测试用例,但是在没有完成参数的情况下使用了beforeEach().这导致URL冲突.通过explcitly声明每个beforeEach(完成)和调用done(),Mocha将按顺序运行,不再存在问题.
2).如果您在同一个testsuite文件中有多个测试,请确保如果您在后续测试中使用备用响应声明了相同的URL,则在先前测试中设置的任何Nock夹具实际上都会执行.如果先前的nock fixture没有被调用,那么nock STILL将保留来自错误测试(前一个)的响应.这是我的主要问题.您可以争辩说,如果测试不能运行,测试不应该声明任何固定装置 - 但您也可以认为这仍然是Nock工作方式的错误.每个测试夹具都在他们自己的describe/beforeEach(done)函数中被隔离.
2天后更新...... OK点2).再次咬我一点,我很高兴我写了上面的注释,提醒自己这个难以调试的问题.如果你正在使用摩卡和诺克一起意识到这个问题!!
最终还是实现了一个nock辅助函数来协助这个(这里有coffeescript):
global.resetNock = ->
global.nock.cleanAll()
global.nock.disableNetConnect()
Run Code Online (Sandbox Code Playgroud)
然后在beforeEach的开始,只需应用resetNock()
| 归档时间: |
|
| 查看次数: |
4635 次 |
| 最近记录: |