Espere as expectativas com o tempo


A Swift tem problemas especiais para mostrar o ponto de ruptura de exceção correto quando os fechos 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. I estou testando uma chamada assíncrona usando XCTestExpectation. O código a seguir funciona (o teste é bem-sucedido) quando o completionHandler é executado antes do tempo limite especificado de 1 segundo. No entanto, se o completionHandler não é chamado e, portanto, a expectativa não cumprida, em vez de obter uma falha de teste ao chamar waitForExpectationsWithTimeout eu recebo um EXCBADACCESS, o que não é muito útil, pois isso torna impossível ver os resultados da suite de teste inteiro. Como posso evitar isso e obter uma falha de teste normal pediu 21 de dezembro 14 às 15: 31Teste de teste assíncrono com Xcode 6 Em 2017, a Apple enviou uma estrutura de testes renovada em Xcode chamado XCTest, e houve muita alegria. A estrutura antiga não tinha sido atualizada em anos e várias ferramentas e estruturas de teste de terceiros surgiram para fornecer novos recursos e funcionalidades. Foi bom ver as ferramentas incorporadas recebendo um pouco de amor novamente, e este ano, a Apple está enviando alguns recursos com o Xcode 6 que estavam faltando na atualização dos últimos anos. Um Im particularmente feliz em ver é o suporte para testes assíncronos. Se temos um teste que tem de dar início a uma tarefa assíncrona, se ele é executado em outro thread ou no threadloop principais threads, como podemos testá-lo Considere um pedido web. Poderíamos iniciar uma solicitação da web e passar em um bloco de conclusão, em seguida, fazer nossas afirmações de teste, no manipulador de conclusão ou não. No entanto, como o pedido de web ainda não foi feito, muito menos uma resposta recebida nem o nosso bloco de conclusão foi chamado, nosso método de teste vai sair antes que as asserções sejam testadas. Vejamos um teste para uma classe que baixa páginas da web. Normalmente, não gostaríamos de fazer pedidos de web reais em testes. Em vez disso, desligue os pedidos usando alguma ferramenta (Im partial to OHHTTPStubs). Mas para os propósitos desses exemplos, bem quebrar algumas regras e fazer pedidos reais da web. Podemos dar à classe em teste um bloco de manipulador de URL e conclusão, e ele baixará a página e chamará o bloco, passando uma string contendo a página da Web ou uma string vazia se ocorrer uma falha. Não é uma API grande, mas novamente, estavam quebrando algumas regras. No entanto, o código de teste abaixo nunca vai falhar. O método de teste retornará sem dar ao bloco completionHandler a chance de ser chamado. Antes de Xcode 6s versão de XCTest, apenas usando o que vem no estanho com Xcode, poderíamos sentar e girar em um loop tempo que chama os segmentos principais executar loop até que a resposta chegue ou algum tempo limite tenha decorrido. Heres trabalhando código de teste, a velha maneira. O loop while executa o loop de execução de threads principais por 10 milissegundos de cada vez até que a resposta chegue, ou até que transcorram 5 segundos sem que ele tenha chegado. Isso é útil. Não é terrível. Não é o fim do desenvolvimento de software worldbut seu não grande. Agora há uma maneira melhor. Expectativas Elevadas Com o Xcode 6, a Apple adicionou expectativas de teste ao framework XCTest na forma da classe XCTestExpectation. Quando instanciamos uma expectativa de teste, a estrutura de teste espera que ela seja cumprida em algum momento no futuro. Nosso código de teste cumpre a expectativa no bloco de conclusão com uma chamada para o método XCTestExpectation cumprir. Isso toma o lugar de definir uma flag como responseHasArrived no exemplo anterior. Em seguida, dizemos ao framework de teste para aguardar (com um tempo limite) para que suas expectativas sejam cumpridas através do método waitTextoTextTimeout do XCTestCase: handler. Se o manipulador de conclusão é executado dentro do tempo limite e as chamadas atendem. Então todas as expectativas dos testes terão sido cumpridas. Se não, então o teste viverá uma existência triste, solitária, não cumprida até que ele sai do escopo. E ao viver uma existência triste, solitária, não cumprida, quero dizer que a expectativa falha no teste quando o tempo se esgotar. A expectativa fracassada não deveria se sentir tão desanimada. Lembre-se que um resultado falha não é o sinal de um mau teste um resultado indeterminado é. Essa expectativa pode sentir orgulho como declara o fracasso. Heres um exemplo usando XCTestExpectation: Criar a expectativa com uma descrição para tornar os resultados mais legíveis. No bloco de conclusão, a expectativa de chamada cumpre para dizer ao teste que essa expectativa foi, de fato, cumprida. Em seguida, pendurar no waitForExpectationsWithTimeout: manipulador: até que a solicitação é enviada, a resposta chega e nosso manipulador de conclusão é chamado ou o tempo limite ocorre. Isso é bom ol Objective-C, mas também podemos fazê-lo em Maçãs brilhante nova linguagem Swift. E é isso. É uma classe fácil de usar para testar código assíncrono. Não consigo obter informações suficientes sobre o iOS 8 e Swift Junte-se a nós para começar o iOS com os bootcamps iOS avançados e avançados.

Comments

Popular Posts