Teste de unidade Xcode com Cocoapods


119

Tenho batido minha cabeça contra a parede com isso nos últimos dias, mas apesar das várias pesquisas no Google / SO / Github, não consigo encontrar uma solução para os problemas que estou tendo!

Tudo o que estou tentando fazer é criar alguns testes de unidade para meu aplicativo que usa pods do Firebase.

Estou usando o Xcode 7.3.1 e o Cocoapods 1.0.1. Atualização: o problema permanece com o Xcode 8.0

Com este podfile:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

target 'MyApp' do
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target 'MyAppTests' do
        inherit! :search_paths
    end
end

Na minha aula de XCTest eu recebo

Módulo obrigatório 'Firebase' ausente

erro em @testable import MyApp

Alternativamente com este podfile:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

def common_pods
    pod 'SwiftyTimer'
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'
end

target 'MyApp' do
    common_pods
end

target 'MyAppTests' do
    common_pods
end

Os testes são construídos, mas meu console está repleto de avisos, por exemplo:

A classe <-FirebaseClassName-> é implementada em ... MyApp ... e ... MyAppTests ... Um dos dois será usado. Qual é indefinido


Eu estava usando apenas o Firebase Analytics. Depois de mudar para o Google Analytics, tudo funciona perfeitamente.
marosoaie

Ainda não tentei, mas posso tentar incluir o Firebase manualmente sem usar cápsulas de cacau: firebase.google.com/docs/ios/setup#frameworks
Jonny

1
Isso ainda é um problema
Edward

Respostas:


84

Eu tive o mesmo problema. Eu resolvi passando pod 'Firebase'para o meu alvo de teste. Altere seu Podfile para este:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

target 'MyApp' do
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target 'MyAppTests' do
        inherit! :search_paths
        pod 'Firebase'
    end
end

Obrigado, mas acabei de tentar isso e ainda tenho o problema "Classe ... está implementado em ambos ...".
doovers

1
Funcionou para mim, mas ainda não faz sentido para mim. Não é a primeira vez que posso dizer que o Firebase está configurando seus podspecs de maneira estranha, cf. twitter.com/dirtyhenry/status/836240557311684608, mas a equipe do Firebase não responde :(
Dirty Henry

4
Fazer essa alteração não apagou imediatamente o aviso, mas foi resolvido depois que executei pod install.
blwinters

Metade do problema resolvido. e a outra metade é resolvida adicionando "$ {PODS_ROOT} / Firebase / Core / Sources" ao seu destino de testes apenas em Configurações de compilação -> Caminhos de pesquisa de cabeçalho
ArgaPK

Depois de fazer essa alteração, não se esqueça de executar pod installpara atualizar as dependências do projeto;)
jawad

57

Tente alterar a herança para :complete, como em:

target 'MyAppTests' do
    inherit! :complete
end

É importante ressaltar que permite que qualquer outra pessoa que esteja verificando seu repositório faça o de pod updatecostume, sem ter que copiar .xcconfigarquivos ou outro hackery apenas para construir.


1
Este também tem a edição "Aula ... está implementado em ambos ..."
Diogo T

Isso fez o erro de tempo de compilação desaparecer, mas causou este em tempo de execução: clang: erro: o comando do linker falhou com o código de saída 1 (use -v para ver a invocação)
CMont

Funcionou para mim também! Obrigado :)
smapps

52
  1. Selecione sua configuração de destino de teste de unidade.
  2. Vá para Configurações de compilação.
  3. Procure caminhos de pesquisa de cabeçalho.
  4. Adicione este valor $ (SRCROOT) / Pods com recursivo, então o Xcode resolverá o caminho para você.

Exemplo


1
Obrigado @Kanika Sharma
Rahul K Rajan

34

O problema é que o Firebase faz algo especial com os Caminhos de pesquisa de cabeçalho depois que o CocoaPods gera seu próprio valor para a configuração, para que o CocoaPods não pegue essa alteração para transportá-la para o destino de teste. Você pode resolver isso de duas maneiras:

  1. Localize MyAppTests.<configuration>.xcconfigno navegador de arquivos e adicione o seguinte a HEADER_SEARCH_PATHS:

    ${PODS_ROOT}/Firebase/Analytics/Sources [*]

  2. Encontre a configuração para Caminhos de pesquisa de cabeçalho em Configurações de compilação e adicione o mesmo valor da opção 1 à lista. Você não deve precisar defini-lo como recursivo.

* De acordo com o comentário de AKM, isso mudou para ${PODS_ROOT}/Firebase/Core/Sourcesna versão 3.14.0


Tentei isso, mas ainda recebo os mesmos avisos
doovers

8
A partir do Firebase 3.14.0, esta solução é válida, mas o patch mudou para${PODS_ROOT}/Firebase/Core/Sources
AKM

1
O novo caminho funcionou para mim também! Estou executando o CocoaPods versão 1.2.0 , mas lembre-se de que também tive que adicionar inherit! :search_pathsao destino de teste no Podfile.
Paulo Mattos

2. não funciona para mim. Usando Firebase 3.x (não o mais recente 4.x)
Jonny

O problema pode ser seguido aqui: github.com/firebase/firebase-ios-sdk/issues/58
CMont

7

Três etapas antes que eu pudesse fazer isso funcionar:

CocoaPods: 1.5.0 Swift 4 Firebase: 4.13.0

Etapa 1: certifique-se de adicionar o seguinte bloco de destino em seu podfile.

# Uncomment the next line to define a global platform for your project
platform :ios, '11.3'

target 'TIMII' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!

# Pods for TIMII
pod 'Firebase/Core'
pod 'Firebase/Database'
pod 'Firebase/Auth'
pod 'Firebase/Storage'

    target 'TIMIITests' do
        inherit! :search_paths
        pod 'Firebase/Core'
    end

end

Etapa 2: Na guia Configurações de compilação do Navegador do projeto YourAppTests. Encontre a linha Header Search Path e adicione a Debug a seguinte linha

$ (herdado) $ {PODS_ROOT} / Firebase / Core / Sources

Etapa 3: na execução do terminal:

atualização de pod


7

O problema é registrado no projeto firebase aqui:

https://github.com/firebase/firebase-ios-sdk/issues/58

Existe uma solução alternativa:

Adicione "$ {PODS_ROOT} / Firebase / Core / Sources" ao seu destino de testes apenas em Build Settings -> Header Search Paths

mas isso também é corrigido com a atualização para CocoaPods 1.4.0 ou posterior, que é uma solução melhor.

No momento em que estou escrevendo isto (novembro de 2017), o cocoapods 1.4.0 ainda está em beta, portanto, para instalá-lo, você precisa solicitar explicitamente o beta:

gem install cocoapods --pre

Isso e depois fazer um pod installresolveu o problema ao executar meus testes.


1
o que é "PODS_ROOT" ??
ArgaPK

@ArgaPK É uma variável que o cocoapods define. Basta colar exatamente o que escrevi entre os "" s no Xcode. Realmente, a melhor maneira é atualizar seus CocoaPods para> = 1.4.0.
JosephH

1
@JosephH atualizar meus cocoapods para 1.5.2 não resolveu o problema, infelizmente.
Stacy Smith

@AnastasiaKovaleva você executou pod installapós a atualização?
JosephH

@JosephH Running pod installresolveu meu problema! Muito obrigado!
Stacy Smith

4

A solução para mim foi atualizar o cocoapods para a versão 1.1.0.rc.2.

sudo gem install cocoapods --pre


Infelizmente não funciona para mim ... Tenho que retomar meu voto positivo!
Zeb,

Desculpe não ter ajudado vocês, não sei por que resolveu o problema para mim e não para vocês ...
doovers

Estou no dia 1.20 e sem sorte
UKDataGeek

4

Tentei todos os itens acima e encontrei vários erros diferentes, originalmente começando com Missing required module 'Firebase', e depois recebendo "Class ... is implemented in both ... "ou problemas de linker se eu tentasse adicionar pods do Firebase ao meu destino de teste.

A solução que funcionou para mim foi:

  1. Remova o destino de teste inteiramente do Podfile e execute 'pod update' para garantir que o projeto XCode esteja em sincronia.
  2. Abra as configurações de compilação do meu destino de teste e atualize os caminhos de pesquisa do cabeçalho para incluir apenas os 3 itens a seguir:
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

Neste ponto, limpar a pasta de construção, reconstruir e executar novamente os testes funcionou para mim. Espero que isso ajude alguém!


Depois de tentar de tudo neste tópico - esta foi a única resposta que fez as coisas funcionarem para mim. Obrigado!
Ali Parr de

4

Adicionar ${SRCROOT}/Pods/Firebase/CoreOnly/Sourcesaos "caminhos de pesquisa de cabeçalho" do destino de teste de unidade corrigiu o problema. Passos:

  1. Selecione o seu alvo de testes de unidade
  2. Vá para Configurações de compilação
  3. Pesquisar caminho de pesquisa de cabeçalho
  4. Adicionar $ {SRCROOT} / Pods / Firebase / CoreOnly / Sources

insira a descrição da imagem aqui

Depois disso, os testes podem ser executados e o erro desaparecerá.


2

Eu tive um problema parecido. Com base na sua pergunta, copiei o conteúdo do meu MyApp.<configuration>.xcconfigarquivo para o meu MyAppTests.<configuration>.xcconfigarquivo. Limpei e construí os testes e funcionou.


Essa foi a única solução que funcionou para mim. Obrigado! Estou pensando em fazer um processamento pós-instalação no Podfile fazendo isso
SauloT 27/10/16

1

Adicione "$ {PODS_ROOT} / Firebase / Core / Sources" ao seu destino de testes apenas em Build Settings -> Header Search Paths


O que é isso ? PODS_ROOT
ArgaPK

ele irá buscar o diretório para pod
Karthick Vadivel

1

Como @Will mencionou um problema em torno dos caminhos de pesquisa de cabeçalho após a instalação do CocoaPods.

Eu tenho um projeto com vários destinos onde pod 'Firebase' incorporado em um módulo separado, digamos MyProject-Shared. Pod Firebase em 'Podfile' instalado apenas para o destino 'MyProject-Shared'. Outros módulos que desejam usar 'MyProject-Shared' não podem ser compilados devido a um erro:

'faltando módulo obrigatório "Firebase"'

O truque no meu caso era adicionar o seguinte caminho de pesquisa de cabeçalho ausente nas configurações de compilação de cada destino fazendo referência ao Analytics-Framework :

"${PODS_ROOT}/Firebase/CoreOnly/Sources"

Por favor, veja a foto abaixo: Caminho de pesquisa de cabeçalho

Espero que economize seu tempo.


1

Um método mais simples que também funciona:

target 'MyApp' do
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target :MyAppTests
end

0

Missing required module Firebase SEM solução CocoaPods

Para aqueles que encontram o mesmo problema, mas NÃO usam CocoaPods:

Se você estiver usando Firebase, do que você tem alguma pasta contendo Firebase.he module.modulemaparquivo. Por exemplo -YOUR_PROJECT_DIR/Linking

Se o objetivo do projeto principal está funcionando corretamente, você deve ir para ProjectSettings -> Alvos. Selecione o alvo de teste. Pesquise User headerse adicione o caminho a YOUR_PROJECT_DIR/Linking. Selecione a recursiveopção e você deve estar pronto para ir.

Veja a captura de tela para mais detalhes:

insira a descrição da imagem aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.