Monday, 20 November 2017

Waitforexpectationswithtimeout Swift


Tenho tido pouco sucesso na prática do desenvolvimento orientado por teste com o código assíncrono Swift 2.0 no Xcode 7. As únicas soluções com as quais eu tive algum sucesso são os mecanismos artificiais e de atraso hacky que evitam a necessidade de waitForExepectationsWithTimeout (). Eu gostaria de executar testes assíncronos como segue, mas esse código consistentemente falha: Thread 1: EXCBADACCESS (code1, address0x6.) Quando a expectativa é cumprida (expectation. fulfill ()) fora do encerramento assincronamente executado, este teste passará como Esperado (contanto que eu comente o cumprimento dentro do fechamento). Mas fazê-lo obviamente derrota a finalidade de sincronizar a avaliação do teste. Vou notar que mesmo que o teste falhar, a mensagem Executada imprime como seria de esperar. Além disso, se um ponto de interrupção é introduzido no waitForExpectationsWithTimeout. , O teste é bem sucedido, o teste tem sucesso quando é introduzido um atraso artificial do sono. Isso me leva a acreditar que waitForExepectaionsWithTimeout () não está esperando. É certo que sou novo no Xcode e no Swift, portanto, se eu estou faltando alguma coisa óbvia, eu apreciaria muito qualquer comentário. O que há de errado com meu código acima Existem variáveis ​​ambientais que eu possa fornecer para ajudar a depurar o problema Executando: OS X El Capitan 10.11 Beta (15A263e), Xcode 7.0 beta (7A120f) perguntou Aug 21 15 at 20: 06Swift tem um problema especial 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. Asynchronous Testando Com Xcode 6 Em 2013, a Apple enviou uma estrutura de testes renovados 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 vivendo uma existência triste, solitária, não cumprida, quero dizer que a expectativa falha no teste após o tempo limite. 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, de fato, foi 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.

No comments:

Post a Comment