pacote - ios firebase github




Bibliotecas não encontradas ao usar o CocoaPods com testes lógicos do iOS (10)

Eu estou tentando escrever alguns testes de lógica do iOS contra classes no meu projeto que usam a funcionalidade de algumas das bibliotecas no meu podspec. Estou usando o bundle de teste de unidade padrão fornecido no Xcode (embora não seja Testes de aplicativo, apenas Testes de unidade).

Por exemplo, eu uso o Magical Record e tenho essa biblioteca vinculada ao meu podspec. Ele está presente no projeto Pods no meu espaço de trabalho e funciona como esperado quando o aplicativo está sendo executado no simulador ou no dispositivo. Quando tento vincular ao teste o objeto que usa o Magical Record, no entanto, recebo um erro de vinculador declarando que ele não consegue encontrar os seletores do Magical Record. Eu tentei atualizar meu HEADER_SEARCH_PATH no meu pacote de testes lógicos, mesmo codificando-o para o diretório de cabeçalhos criado pelo CocoaPods, mas sem sorte.

Eu posso executar testes de unidade contra classes que não usam bibliotecas CocoaPods sem nenhum problema.

Eu estou indo sobre isso errado? Devo estar fazendo outra coisa para obter o compilador para ver as bibliotecas CocoaPods?


A partir do CocoaPods 1.x, há uma nova maneira de declarar dependências compartilhadas entre um destino e o alvo de teste correspondente. Eu estava usando a solução aceita por Mark Struzinski até esse ponto, mas usar esse método gerou um grande número de avisos ao executar meus testes que:

Class SomeClass is implemented in both /Path/To/Test/Target and /Path/To/App/Target. One of the two will be used. Which one is undefined.

Com CocoaPods 1.x podemos declarar nosso alvo -Test como herança através dos caminhos de busca do alvo pai, assim:

target 'MyApp' do
    pod 'aPod'
    pod 'anotherPod'
    project 'MyApp.xcodeproj'
end
target 'MyAppTests' do
    inherit! :search_paths
    project 'MyApp.xcodeproj'
end

Isso fará com que o destino -Test tenha acesso às dependências do destino do aplicativo, sem várias cópias binárias. Isso acelerou seriamente os tempos de criação de testes para mim.


A próxima sintaxe fornece o melhor resultado para mim (testado no cocoapod v.1.2.1):

https://github.com/CocoaPods/CocoaPods/issues/4626#issuecomment-210402349

 target 'App' do
    pod 'GoogleAnalytics' , '~> 3.0'
    pod 'GoogleTagManager' , '~> 3.0'

     pod 'SDWebImage', '~>3.7'
     platform :ios, '8.0'
     use_frameworks!

     target 'App Unit Tests' do
         inherit! :search_paths
     end
 end

Sem isso eu tenho avisos durante o teste sobre símbolos duplicados.

Depois disso, os avisos desapareceram.


Estou trabalhando com a integração do GoogleMaps Objective-C POD no iOS com meu aplicativo Swift e, para mim, o problema era que o destino de teste não tinha uma referência ao arquivo de cabeçalho de ponte ( SWIFT_OBJC_BRIDGING_HEADER ) nas configurações de compilação. Certifique-se de que seu aplicativo e os destinos de aplicativos de teste apontam para que as chamadas da API de terceiros (API de mapas, etc.) possam ser usadas em testes rápidos de unidade.


Eu adicionei :exclusive => true para evitar erros de símbolo duplicados no alvo de teste da aplicação.

target 'myProjectTests', :exclusive => true do
   pod 'OCMock', :head
   pod 'XCTAsyncTestCase', :git => 'https://github.com/iheartradio/xctest-additions.git'
end

link_with 'myProject', 'myProjectTests'

Quando mudei o alvo do teste de aplicação para o teste 1 da unidade lógica, ocorre o erro do linker. Depois de remover :exclusive => true , tudo funciona novamente.

target 'myProjectTests', do
   pod 'OCMock', :head
   pod 'XCTAsyncTestCase', :git => 'https://github.com/iheartradio/xctest-additions.git'
end

link_with 'myProject', 'myProjectTests'

:exclusive => true declara que tudo fora do...end não deve ser vinculado ao myProjectTests , o que é razoável em alvos de teste de aplicativo, mas causará erros de vinculador em alvos de teste de lógica.


Eu descobri isso como o principal alvo do meu aplicativo estava recebendo as configurações da biblioteca CocoaPods. O CocoaPods inclui um arquivo .xcconfig chamado Pods.xcconfig. Este arquivo contém todos os caminhos de pesquisa de cabeçalho.

Se você olhar seu projeto no navegador de projetos e clicar na guia Informações, verá suas configurações de construção listadas na seção superior. Se você abrir o triângulo de divulgação para suas diferentes configurações, verá os Pods listados no seu destino principal. Eu tive que clicar no menu suspenso e adicionar Pods ao alvo de teste lógico também.

Também tive que copiar as configurações de $(inherited) e ${PODS_HEADERS_SEARCH_PATHS} do meu destino principal e copiá-las para o destino de teste de lógica em Configurações de compilação / HEADER_SEARCH_PATHS.

Finalmente, eu tive que adicionar libPods.a na fase de compilação Link Binary with Libraries para meu alvo de testes lógicos.

Espero que isso seja capaz de ajudar outra pessoa.


Eu tive problemas usando o OpenCV no XCTest. Ele estava me dando erros de linker de Undefined symbols for architecture arm64 para classes como cv::Mat . Estou instalando o OpenCV através do CocoaPods usando o pod 'OpenCV', '~> 2.0' sob o alvo principal. Não importa o quanto eu tentei colocar a dependência do OpenCV sob o alvo de teste ou usar a inherit! :search_paths inherit! :search_paths nada disso funcionou. A solução foi criar um abstract_target assim:

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

abstract_target 'Shows' do
  pod 'RMVision', path: '../..'
  pod 'RMShared', path: '../../../RMShared'
  pod 'OpenCV', '~> 2.0'

  target 'RMVisionSample' do
    # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
    # use_frameworks!

    # Pods for RMVisionSample
  end

  target 'RMVisionSampleTests' do
    # inherit! :search_paths
    # Pods for testing
  end

  target 'RMVisionBenchmarks' do
    # inherit! :search_paths
    # Pods for testing
  end

end 

Também são úteis os pod deintegrate & pod clean que ajudam a pod clean o projeto e garantem que você comece de novo ao testar. Você pode instalar esses dois usando [sudo] gem install cocoapods-deintegrate cocoapods-clean .


Existe uma solução que encontrei aqui Testes de unidade com CocoaPods :

Abra o arquivo de projeto no Xcode e, em seguida, escolha o projeto (não o destino). No painel à direita, há uma seção chamada Configurações. Escolha Pods na coluna "Com base no arquivo de configuração" do seu destino de teste.


Minha solução para esse problema foi alterar meu Podfile para incluir a biblioteca em ambos os destinos como este

target "MyApp" do  
    pod 'GRMustache', '~> 7.0.2'
end

target "MyAppTests" do
    pod 'GRMustache', '~> 7.0.2'
end

E como estou usando o swift, também precisei configurar o destino de teste para incluir o arquivo MyApp-Bridging-Header.h . (No grupo do Swift Compiler, na guia Build Settings)


Tente isto está trabalhando para mim,

Precisamos definir pods em configurações,

O Projeto-> Info-> Configurações no projeto Xcode (seu projeto) deve ser configurado para o projeto principal 'Pods' para Debug, Release (e o que mais você tem). Consulte "Cabeçalhos não encontrados - caminhos de pesquisa não incluídos"

Espero que isso seja ajuda para alguém.


Você pode usar link_with de acordo com a solução @Keith Smiley.

Caso você tenha pods comuns e especificações para cada destino, convém usar a opção "def" para definir o grupo de pods. e use o "def" mais tarde no alvo exclusivo.

def import_pods
    pod 'SSKeychain'
end

target 'MyProjectTests', :exclusive => true do
  import_pods
end

target 'MyProject', :exclusive => true do
  import_pods
  pod 'Typhoon'
end

No exemplo acima, adicionei "SSKeychain" aos dois destinos e "Typhoon" apenas ao destino "MyProject"







cocoapods