Como altero o tempo limite em uma especificação assíncrona de nó jasmim


92

Como faço para que este teste seja aprovado sem recorrer a blocos runs / waitsFor?

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

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

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

         done();
     });
});

Respostas:


107

Você pode (agora) defini-lo diretamente nas especificações, de acordo com os documentos do 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;
    });
});

Sim, mudar o jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;valor funcionou para mim em uma configuração totalmente nova construída do zero usando Jasmine + Jest. Funciona como esperado.
Ignacio Segura

Eu concordo @willydee, tive problemas ao executar testes com cloudinary e este pequeno trecho veio em meu socorro.
Dev Yego

1
Vale a pena notar, talvez, que isso tenha que acontecer antes do it. No momento em que você está no teste, doneparece já ter se ligado ao que quer que DEFAULT_TIMEOUT_INTERVALfosse antes de itcomeçar.
ruffin

81

Solicitação pull enviada para este recurso ( 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 definir o tempo limite global Jasmine-Node, faça o seguinte:

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

Crédito ao desenvolvedor Gabe Hicks por descobrir a parte .getEnv () por meio de depuração, apesar da desinformação no documento README que afirma que foi feito configurando jasmine.DEFAULT_TIMEOUT_INTERVAL.

Se você deseja definir um tempo limite personalizado apenas para um it (), pode tentar passar o tempo limite (milissegundos) como um terceiro argumento (após a instrução da string e a função). Há um exemplo disso sendo feito aqui , mas não tenho certeza do que aconteceria se o tempo limite personalizado fosse maior do que o padrão do Jasmine. Eu espero que isso falhe.


29
Atualização para quem tropeçar nesta resposta em 2014: Para Jasmine 2, a configuração de jasmine.DEFAULT_TIMEOUT_INTERVAL funciona.
Simon Groenewolt

2
Funciona para mim em uma configuração totalmente nova usando Jest + Jasmine. Acabei de adicionar jasmine.DEFAULT_TIMEOUT_INTERVAL = 12000;um arquivo de configuração global que uso para todos os testes e funciona conforme o esperado.
Ignacio Segura

23

Parece que agora você pode adicioná-lo como o último argumento para a itfunção:

describe('my test', function(){
    it('works', function(done){
        somethingAsync().then(done);
    }, 10000); // changes to 10 seconds
});

13

No Angular, coloque isso fora do seu bloco de descrição:

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

Isso se aplica a todos os testes no arquivo .spec.ts


3

Adicionando: jasmine.DEFAULT_TIMEOUT_INTERVAL = yourTime;em um arquivo auxiliar funcionou para mim.


3

Coloque depois da describedeclaração:

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

0

Por que não espionando setTimeout() ?

Algo como:

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

setTimeOut(function () { ... }, 2500);
expect(spy).toHaveBeenCalled();

1
Obrigado. Esses são testes de integração, node.js está chamando um serviço externo que geralmente é lento.
Brian Low

isso é brilhante, torna possível testar o tempo limite sem fazer o teste esperar pelo tempo limite real
Guillaume

desta forma, não exercitamos a passagem do tempo e chamamos o fn imediatamente, enquanto o original nunca o chama antes do próximo ciclo.
André Werlang

0

No meu caso, tive vários casos de teste e, enquanto usava a solução mencionada, estava usando:

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

o DEFAULT_TIMEOUT_INTERVAL não foi atualizado no primeiro caso de teste, então eu tive que adicionar este:

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

ao meu código para executar todos os testes com sucesso.


0

Para fazer isso globalmente para todos os seus testes (no caso do e2e ou teste de integração), você pode usar um auxiliar.

Um arquivo auxiliar, quando configurado corretamente, deve ser carregado antes que os testes sejam executados e permitir que você altere o DEFAULT_TIMEOUT_INTERVAL globalmente:

spec / support / jasmine.json

{
    ...
    "helpers": [
        "/path/to/helpers/**/*.ts"
    ]
}

helpers / timeout.ts

jasmine.DEFAULT_TIMEOUT_INTERVAL = 300000;

-18

Altere j $ .DEFAULT_TIMEOUT_INTERVAL para 10000 no seguinte arquivo: npm \ node_modules \ jasmine-core \ lib \ jasmine-core


Não é frutífero para os cenários em que as bibliotecas são instaladas sempre que o teste é executado. Ex: - rodando CI on Cloud.
domino_katrino
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.