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

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

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

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.


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

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


3

Ponlo después de la describedeclaración:

describe("A saves to DB", function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

2

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


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

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.


-17

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.