好的,这样就可以了(示例代码):
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();
});
有很多复杂的因素。有两点需要注意:
1)。我有异步测试用例,但在没有 done 参数的情况下使用 beforeEach() 。这导致了 URL 冲突。通过明确声明每个 beforeEach(done) 并调用 done() Mocha 将按顺序运行,不再有问题。
2)。确保如果您在同一个测试套件文件中有多个测试,那么您在之前的测试中设置的任何 Nock 固定装置如果您在后续测试中声明了具有备用响应的相同 URL,那么您将实际执行。如果没有调用先前的 nock 夹具,则 nock STILL 保留来自错误测试(前一个)的响应。这是我的主要问题。您可能会争辩说,如果测试不运行,则不应声明任何固定装置 - 但您也可能会争辩说这仍然是 Nock 工作方式中的一个错误。测试装置各自独立于各自的 describe / beforeEach(done) 函数中。
2 天后更新...好的第 2 点)。再次咬我,我很高兴我写了上面的注释来提醒自己这个难以调试的问题。如果您同时使用 Mocha 和 Nock,请注意这个问题!
最终也实现了一个 nock 辅助函数来帮助解决这个问题(此处为咖啡脚本):
global.resetNock = ->
global.nock.cleanAll()
global.nock.disableNetConnect()
然后在 beforeEach 开始时只需应用 resetNock()