Estou tentando testar um pedido assíncrono com XCTest e, portanto, usando expectationWithDescription. No entanto, quando waitForExpectationsWithTimeout é chamado imediatamente trava sem mesmo esperar o tempo limite. Eu tentei mesmo pôr a operação da realização logo após apenas para excluir uma edição do timeout, mas di nenhumas coisas da mudança esta é minha função: O mesmo comportamento acontece em outras funções. Se eu tirar a operação waitForExpectationsWithTimeout e manter a operação de expectativaWithDescription, ele falha no final da função. Em ambos os casos, o repot de falha é o seguinte: perguntado Jul 22 15 at 12: 21Swift tem problemas especiais para mostrar o ponto de quebra de exceção correto quando fechamentos estão presentes no mesmo escopo. Eu vi o mesmo problema em um XCTestCase que usou dispatchafter e até mesmo através do ponto de interrupção de exceção era a mesma linha como waitForExpectationsWithTimeout o caso de teste estava falhando por causa de um downcast em um objeto nil. Eu sei que este não é o seu caso, mas sempre que isso acontece eu sugiro remover as declarações de uma linha de cada vez e executando o teste após cada remoção. Se o teste não falhar, você identificou o culpado. Esta é, infelizmente, a melhor opção no momento desta escrita sempre que Swift mostra um ponto de interrupção de exceção em uma linha que não faz sentido, especialmente a infame linha 0 de uma classe que você pode ver em ferramentas de relatório de falhas. Deixe-nos saber se você descobriu o seu crash. XCTestExpectation Gotchas XCTestExpectation simplifica o teste de callback estilo de código, mas algumas das suas escolhas de design fazer testes usando frágil, a menos que theyrsquore atenuado: Explode se tudo funciona bem, mas mais tarde do que você esperava. Ele explode se tudo funciona bem mais de uma vez. Este artigo apresenta duas mitigações concretas: Use referências fracas para garantir que a expectativa morre antes que possa causar problemas. Use uma API de promessa diferente para fazer sua espera. Uma revisão rápida XCTestExpectation é a ferramenta Applersquos unidade de teste de estrutura XCTest prevê lidar com APIs assíncronas. Para ser usado, você pede ao caso de teste para criar um ou mais: espere um tempo configurável para cada expectativa pendente para ser preenchido: e Log uma falha de teste se o tempo se esgotar antes que isso aconteça: Espera assíncrona falhou: Tempo limite excedido de 1 segundos, com expectativas não cumpridas: ldquoitrsquoll acontecer, merdquo de confiança. Teria sucesso se tivesse sido preenchido no tempo: Nós trip mais uma asserção em XCTest: Terminar o aplicativo devido a exceção uncaught lsquoNSInternalInconsistencyExceptionrsquo, razão: lsquoAPI violação - múltiplas chamadas feitas para - XCTestExpectation cumprir para chamadas back. rsquo Isso provavelmente indica um Erro real no código chamando o callback na maior parte do tempo, mas se doesnrsquot, yoursquoll quer saber sobre e ser capaz de esquivar esta afirmação, também. Whatrsquos Wrong Este cenário de callback duplo chama duas vezes consecutivas. Mas se houve um atraso entre a primeira ea segunda chamada de volta, eo corredor de teste aconteceu para sair durante esse atraso, yoursquod obter uma corrida de teste bem sucedida ao invés de bater sempre. Com um atraso entre retornos de chamada, o seu só desacelera a afirmação quando outros testes mantiveram o processo do corredor de teste funcionando o suficiente. Esta situação é paralela à da chamada de retorno demasiado tarde: nenhum problema até aparecer até que outra coisa acabe o relógio. Você nunca vai tropeçá-los quando o seu jogo bater em qualquer que seja o teste mais recente em que você está trabalhando, porque um corredor de teste executando apenas o teste assíncrono vai sair assim que o tempo de espera se esgote, antes que o retorno de chamada demasiado tarde / . Você não pode mesmo trip-los quando você executar toda a suíte de teste no início, porque eles podem ser o último teste na corrida ou os testes que seguem donrsquot executar por tempo suficiente. Isso também é desagradável para executar em: Quando uma asserção de viagens, ele bombas todo o processo de teste. Essas afirmações não permitem testar as falhas que permitiriam que os testes continuassem em vez disso, o XCTest trata como erro do programador: Cumprir uma promessa depois que seu teste já terminou. Preencher uma promessa já cheia Para ser justo, esses casos são chamados para fora na documentação para XCTestExpectation. fulfill (): Chamada - preencher para marcar uma expectativa como tendo sido atendidas. Itrsquos um erro para chamar - preencher uma expectativa que já foi cumprida ou quando o caso de teste que vended a expectativa já foi concluída. Mas a documentação isnrsquot explícito que ldquoitrsquos um errorrdquo traduz para ldquoand ele vai bombar todo o seu teste processrdquo. Evitando Essas Afirmações Em ambos os casos, o problema é que wersquore chamada cumprir quando não deveríamos. Então vamos não fazer isso. Deixe a expectativa morrer com o teste XCTest realmente trava sobre as expectativas que cria para que ele possa coletá-los durante a chamada de espera. Nosso método de teste não precisa de mais uma forte referência à expectativa se trabalharmos com uma referência fraca em nosso fechamento de retorno de chamada, a expectativa morrerá com nosso teste, em vez de nos atrasarmos para tropeçar após o teste ter terminado e wersquoll ter Transformou o nosso callback em um não-op. Primeiro, neutralize o teste de tempo-bombardeadoNotWaitingLongEnough, prefixando seu nome com um x para que wonrsquot obter pego pelo corredor de teste mais: Posts recentes
Comments
Post a Comment