¿Cómo cambio el tiempo de espera en una especificación asíncrona de nodo jazmín?

90

¿Cómo puedo hacer que esta prueba pase sin tener que recurrir a bloques de carreras / esperas?

it("cannot change timeout", function(done) {

     request("http://localhost:3000/hello", function(error, response, body){

         expect(body).toEqual("hello world");

         done();
     });
});
Brian Low
fuente

Respuestas:

105

Puede (ahora) configurarlo directamente en la especificación, según los documentos de Jasmine .

describe("long asynchronous specs", function() {

    var originalTimeout;

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
    });

    it("takes a long time", function(done) {
        setTimeout(function() {
            done();
        }, 9000);
    });

    afterEach(function() {
        jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
    });
});
Francisco
fuente
Sí, cambiar el jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;valor me sirvió en una nueva configuración creada desde cero con Jasmine + Jest. Funciona como se esperaba.
Ignacio Segura
Estoy de acuerdo, @willydee, tuve problemas al ejecutar pruebas con cloudinary y este pequeño fragmento vino a mi rescate.
Dev Yego
1
Quizás valga la pena señalar que esto tiene que suceder antes del it. Para cuando estás en la prueba, doneparece que ya te has enganchado a lo que DEFAULT_TIMEOUT_INTERVALera antes de itcomenzar.
ruffin hace
79

Solicitud de extracción enviada para esta función ( https://github.com/mhevery/jasmine-node/pull/142 )

it("cannot change timeout", function(done) {

  request("http://localhost:3000/hello", function(error, response, body){

     expect(body).toEqual("hello world");

     done();
  });

}, 5000); // set timeout to 5 seconds
Brian Low
fuente
43

Para establecer el tiempo de espera global de Jasmine-Node, haga esto:

jasmine.getEnv().defaultTimeoutInterval = timeoutYouWouldPrefer;// e.g. 15000 milliseconds

Gracias al desarrollador Gabe Hicks por descubrir la parte .getEnv () mediante la depuración a pesar de la información errónea en el documento README que afirma que se hace configurando jasmine.DEFAULT_TIMEOUT_INTERVAL.

Si desea establecer un tiempo de espera personalizado solo para uno (), puede intentar pasar el tiempo de espera (milisegundos) como un tercer argumento (después de la declaración de cadena y la función). Hay un ejemplo de que se está haciendo aquí , pero no estoy seguro de lo que sucedería si el tiempo de espera personalizado era más largo que por defecto de Jasmine. Espero que falle.

Colin May
fuente
28
Actualización para cualquiera que encuentre esta respuesta en 2014: Para Jasmine 2, la configuración jasmine.DEFAULT_TIMEOUT_INTERVAL funciona.
Simon Groenewolt
2
Me funciona en una configuración nueva con Jest + Jasmine. Acabo de agregar jasmine.DEFAULT_TIMEOUT_INTERVAL = 12000;un archivo de configuración global que uso para todas las pruebas y funciona como se esperaba.
Ignacio Segura
23

Parece que ahora puede agregarlo como último argumento para la itfunción:

describe('my test', function(){
    it('works', function(done){
        somethingAsync().then(done);
    }, 10000); // changes to 10 seconds
});
d -_- b
fuente
11

En Angular, ponga esto fuera de su bloque de descripción:

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

Esto se aplica a todas las pruebas en el archivo .spec.ts

danday74
fuente
3

Ponlo después de la describedeclaración:

describe("A saves to DB", function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
Michał Kuliński
fuente
2

Agregar: jasmine.DEFAULT_TIMEOUT_INTERVAL = yourTime;en un archivo de ayuda funcionó para mí.

Ivan Rangel
fuente
1

¿Por qué no espiando setTimeout()?

Algo como:

var spy = spyOn(window, 'setTimeout').andCallFake(function (func, timeout) {
    expect(timeout).toEqual(2500);
    func();
});

setTimeOut(function () { ... }, 2500);
expect(spy).toHaveBeenCalled();
ggozad
fuente
1
Gracias. Estas son pruebas de integración, node.js está llamando a un servicio externo que a menudo es lento.
Brian Low
esto es brillante, hace posible probar el tiempo de espera sin hacer que la prueba espere el tiempo de espera real
Guillaume
de esta manera no ejercitamos el paso del tiempo y llamamos al fn de inmediato, mientras que el original nunca lo llama antes del siguiente ciclo.
André Werlang
0

En mi caso, tuve varios casos de prueba y mientras usaba la solución mencionada anteriormente estaba usando:

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
    });

el DEFAULT_TIMEOUT_INTERVAL no se actualizó en el primer caso de prueba, así que tuve que agregar esto:

  beforeAll(() => {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
  })

a mi código para ejecutar con éxito todas las pruebas.

Andreas Foteas
fuente
-17

Cambie j $ .DEFAULT_TIMEOUT_INTERVAL a 10000 en el siguiente archivo: npm \ node_modules \ jasmine-core \ lib \ jasmine-core

sharaj rewoo
fuente
No es fructífero para los escenarios donde se instalan las bibliotecas cada vez que se ejecuta la prueba. Ej .: - ejecutar CI en la nube.
domino_katrino