Sunday 17 December 2017

Espera as especificações com horário de atendimento


Em meus testes de unidade, estou usando o método - XCTestCase keyValueObservingExpectationForObject: keyPath: handler: para garantir que meu NSOperation termine, aqui está o código do meu projeto XCDYouTubeKit: Este teste sempre passa quando o administrai localmente no meu Mac, mas às vezes Falha no Travis com este erro: falhou: detectou NSRangeException, não é possível remover um observador ltXCKVOExpectation 0x1001846c0gt para o caminho da chave é concluído a partir de ltXCDYouTubeVideoOperation 0x1001b9510gt porque ele não está registrado como observador. Estou fazendo algo errado Seu código está correto, você encontrou um bug no framework XCTest. Aqui está uma explicação em profundidade, você pode pular para o final desta resposta, se você está apenas procurando uma solução alternativa. Quando você chama keyValueObservingExpectationForObject: keyPath: handler. Um objeto XCKVOExpectation é criado sob o capô. É responsável por observar o objectkeyPath que você passou. Uma vez que a notificação do KVO disparou, o método seguroNomregistro é chamado, é aí onde o observador é removido. Aqui está a implementação (engenharia reversa) do método safeNomregister. Este método é chamado mais uma vez no final do waitForExpectationsWithTimeout: manipulador: e quando o objeto XCKVOExpectation é desalocado. Observe que a operação termina em uma linha de fundo, mas a prova é executada no segmento principal. Então, você tem uma condição de corrida: se de forma segura, o Registro é chamado no segmento principal antes que a propriedade hasUnregister esteja definida como SIM na linha de fundo, o observador será removido duas vezes, causando a não pode remover uma exceção de observador. Portanto, para solucionar esse problema, você deve proteger o método de preenchimento seguro com um bloqueio. Aqui está um fragmento de código para você compilar no seu alvo de teste que cuidará de corrigir esse bug. Estou testando uma chamada assíncrona usando XCTestExpectation. O código a seguir funciona (o teste é bem-sucedido) quando o CompleteHandler é executado antes do tempo limite de 1 segundo dado. No entanto, se o preenchimento do Handler não for chamado, e, portanto, a expectativa não cumprida, em vez de obter uma falha de teste ao chamar waitForExpectationsWithTimeout, recebo um EXCBADACCESS, o que não é muito útil, pois isso impossibilita a exibição de todos os resultados do conjunto de testes. Como posso evitar isso e obter uma falha de teste normal solicitada em 21 de dezembro 14 às 15:31

No comments:

Post a Comment