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

arc*_*don 9 mocha.js node.js

我使用的是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)


arc*_*don 8

好的,这样可行(示例代码):

 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()