Estou tentando usar Jasmine para escrever algumas especificações de BDD para solicitações básicas de jQuery AJAX. No momento, estou usando Jasmine no modo autônomo (ou seja, através SpecRunner.html
). Eu configurei SpecRunner para carregar jquery e outros arquivos .js. Alguma ideia de por que o seguinte não funciona? has_returned não se torna verdade, mesmo que o "yuppi!" alerta aparece bem.
describe("A jQuery ajax request should be able to fetch...", function() {
it("an XML file from the filesystem", function() {
$.ajax_get_xml_request = { has_returned : false };
// initiating the AJAX request
$.ajax({ type: "GET", url: "addressbook_files/addressbookxml.xml", dataType: "xml",
success: function(xml) { alert("yuppi!"); $.ajax_get_xml_request.has_returned = true; } });
// waiting for has_returned to become true (timeout: 3s)
waitsFor(function() { $.ajax_get_xml_request.has_returned; }, "the JQuery AJAX GET to return", 3000);
// TODO: other tests might check size of XML file, whether it is valid XML
expect($.ajax_get_xml_request.has_returned).toEqual(true);
});
});
Como faço para testar se o retorno de chamada foi chamado? Quaisquer sugestões para blogs / materiais relacionados ao teste de jQuery assíncrono com Jasmine serão muito apreciadas.
Veja o projeto jasmine-ajax: http://github.com/pivotal/jasmine-ajax .
É um auxiliar drop-in que (para jQuery ou Prototype.js) faz stubs na camada XHR para que as solicitações nunca saiam. Você pode então esperar tudo o que quiser sobre o pedido.
Em seguida, permite que você forneça respostas de fixação para todos os seus casos e, em seguida, escreva testes para cada resposta que você deseja: sucesso, falha, não autorizado, etc.
Ele tira as chamadas Ajax do reino dos testes assíncronos e fornece muita flexibilidade para testar como seus manipuladores de resposta reais devem funcionar.
fonte
aqui está um exemplo simples de suíte de teste para um aplicativo js como este
um conjunto de teste de amostra, que chamará de retorno com base no URL regexp
fonte
.andCallFake
, usei no.and.callFake
lugar. Obrigado.Quando especifico o código ajax com Jasmine, resolvo o problema espionando qualquer função dependente que inicie a chamada remota (como, digamos, $ .get ou $ ajax). Em seguida, recupero os retornos de chamada definidos nele e os testo discretamente.
Aqui está um exemplo que dei recentemente:
https://gist.github.com/946704
fonte
Tente jqueryspy.com Ele fornece uma sintaxe elegante como o jquery para descrever seus testes e permite que retornos de chamada sejam testados após a conclusão do ajax. É ótimo para testes de integração e você pode configurar tempos máximos de espera ajax em segundos ou milésimos de segundo.
fonte
Sinto que preciso fornecer uma resposta mais atualizada, pois o Jasmine está agora na versão 2.4 e algumas funções foram alteradas em relação à versão 2.0.
Portanto, para verificar se uma função de retorno de chamada foi chamada em sua solicitação AJAX, você precisa criar um espião, adicionar uma função callFake a ele e usar o espião como sua função de retorno de chamada. Veja como funciona:
Eu fiz o truque para a função de sucesso, bem como para a função de erro, para ter certeza de que Jasmine executará as especificações o mais rápido possível, mesmo se seu AJAX retornar um erro.
Se você não especificar uma função de erro e seu AJAX retornar um erro, você terá que esperar 5 segundos (intervalo de tempo limite padrão) até que o Jasmine emita um erro
Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
. Você também pode especificar seu próprio tempo limite desta forma:fonte