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

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;
    });
});
Francisco
fonte
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
Brian Low
fonte
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.

Colin May
fonte
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
});
d -_- b
fonte
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

danday74
fonte
3

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

Ivan Rangel
fonte
3

Coloque depois da describedeclaração:

describe("A saves to DB", function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
Michał Kuliński
fonte
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();
ggozad
fonte
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.

Andreas Foteas
fonte
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;
bobbyg603
fonte
-18

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

Sharaj Rewoo
fonte
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