¿Cómo volver a probar la misma URL usando Mocha y Nock?

Estoy usando Mocha, Chai, Sinon, Proxyquire y Nock.

Para este escenario de prueba en particular (para el que se pregunta esta pregunta), desee probar exactamente la misma URL varias veces, cada una en una prueba por separado que espera una respuesta diferente.

Por ejemplo, una respuesta sin alimentaciones de comerciantes, 1 de comerciantes y una vez más con 2 alimentaciones de comerciantes.

El código existente funciona, además, si ejecuto las pruebas individualmente pasan.

Sin embargo, si los ejecuto juntos utilizando Mocha en una única suite, fallan. Creo que el problema es que Nock secuestra el objeto http global para una URL determinada y cada prueba (que se ejecuta de forma asíncrona al mismo tiempo) compite por la misma referencia de respuesta global.

En el escenario anterior, una respuesta preparada con una respuesta enlatada de 1 comerciante se sobrescribe con la configuración para responder con 2 comerciantes, etc.

¿Existe un mecanismo para evitar que esto suceda, por ejemplo, garantías en torno a la ejecución en serie de las cajas de prueba async Mocha (que creía que era el comportamiento predeterminado).

En respuesta a su punto 2), puede usar nock.cleanAll() para limpiar todos los nocks preparados:

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

Puede poner esto en un bloque afterEach para asegurarse de que no tenga nocks sobrantes entre las pruebas.

 afterEach -> nock.cleanAll() 

Ok, entonces esto funciona (código de muestra):

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

Había muchos factores que complicaban. Dos cosas a tener en cuenta:

1). Tuve casos de prueba asíncronos pero estaba usando beforeEach () sin el parámetro hecho. Esto fue entonces causando las colisiones URL. Al declarar explícitamente cada antes de Cada (hecho) e invocar hecho (), Mocha se ejecutará en orden serial y ya no habrá ningún problema.

2). Asegúrese de que si tiene más de una prueba en el mismo archivo de pruebas, todos los accesorios de Nock que configuró en una prueba anterior realmente se ejecuten SI ha declarado la misma URL en una prueba posterior con respuesta alternativa. Si el dispositivo nock anterior no se invoca, nock STILL conserva la respuesta de la prueba incorrecta (la anterior). Este fue mi problema principal Podría argumentar que las pruebas no deberían tener ningún accesorio declarado si no se ejecutan, pero también podría argumentar que esto sigue siendo un error en la forma en que funciona Nock. Los dispositivos de prueba se aislaron en sus propias funciones de describir / beforeEach (done).

Actualización 2 días después … OK punto 2). solo me mordió otra vez, y me complació haber escrito la nota anterior para recordarme sobre este problema difícil de depurar. Si estás usando Mocha y Nock juntos, ¡ten en cuenta este problema!

Eventualmente implementó una función de ayuda de nock también, para ayudar con esto (coffeescript aquí):

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

Luego, al inicio de beforeEach solo aplica resetNock ()