如何使用Mocha和Nock重新testing相同的URL?

我正在使用Mocha,Chai,Sinon,Proxyquire和Nock。

对于这个特定的testing场景(要求提供这个问题),希望多次testing完全相同的URL,每个testing需要不同的响应。

例如,没有商家Feed,1商家Feed,还有2商家Feed的响应。

现有的代码都可以运行,而且如果我单独运行testing,它们会通过。

但是,如果我在单个套件中使用摩卡一起运行它们,则会失败。 相信问题是Nock劫持了给定URL的全局http对象,并且每个testing(同时asynchronous运行)都在争夺相同的全局响应引用。

在上面的情况中,用1个商家的回复准备的应答正在被设置覆盖,以与2个商家等进行响应。

有没有一种机制来避免这种情况的发生,例如保证在asynchronous摩卡testing用例(我相信是默认行为)的串行执行。

为了回应你的观点2),你可以使用nock.cleanAll()来清理所有准备好的nocks:

https://github.com/pgte/nock#cleanall

你可以把它放在afterEach块中,以确保你在testing之间没有剩余的afterEach

 afterEach -> nock.cleanAll() 

好的,所以这个工作(示例代码):

  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)。 我有asynchronoustesting用例,但使用beforeEach()没有完成参数。 这导致了URL冲突。 通过明确宣布每个beforeEach(完成)和调用完成()摩卡将按顺序运行,不再有问题。

2)。 请确保如果您在同一个testing套件文件中有多个testing,那么您在之前testing中设置的任何Nock固件实际上都会被执行,只要您在随后的testing中声明了相同的URL并使用备用响应。 如果之前的nock fixture没有被调用,那么nock STILL会保留错误testing(前一个)的响应。 这是我的主要问题。 你可以争辩说,testing不应该有任何固定装置宣布,如果他们不运行 – 但你也可以认为这仍然是一个错误的方式诺克的作品。 testing夹具每个都在自己的描述/每个(完成)function之前分离。

2天后更新…确定点2)。 只是再次咬我一眼,我很高兴我写了上面的注意提醒自己这个难debugging的问题。 如果你一起使用摩卡和诺克一起意识到这个问题!

最后还实现了一个nock helper的function,以帮助这个(coffeescript这里):

 global.resetNock = -> global.nock.cleanAll() global.nock.disableNetConnect() 

然后在每个beforeEach的开始处应用resetNock()