Não é possível carregar o módulo subjacente para o XCTest

180

Estou trabalhando rapidamente no Xcode e, por padrão, ele cria um arquivo de teste que faz referência ao XCTest.

Quando defino a associação de destino para o meu projeto principal, ele causa este erro

Não é possível carregar o módulo subjacente para o XCTest

Se essa associação de destino não estiver definida, os testes serão executados corretamente e tudo funcionará bem.

PS: Eu sou novo no rápido e provavelmente é uma pergunta idiota (por favor, me esclareça)

brduca
fonte
17
Não há perguntas idiotas, gafanhoto, apenas pessoas idiotas. ;-) Ótima pergunta, como todos que lêem isso terão o mesmo problema.
Lance tipo

Respostas:

168

O projeto principal não está vinculado à estrutura do XCUnit. Você deve criar um destino de teste separado para o seu projeto, se ainda não existir, e adicionar seus arquivos de origem de teste a esse destino.

  1. Selecione seu projeto no Project Navigator. Isso abrirá as configurações do projeto no editor.
  2. Clique no botão "+" na parte inferior da coluna, listando seus destinos.

insira a descrição da imagem aqui

  1. Se você estiver trabalhando em um modelo de projeto iOS , selecioneiOS > Test > iOS Unit Testing Bundle .

    Se você estiver trabalhando em um modelo de projeto do OS X , selecione OS X > Test > OS X Unit Testing Bundle.

pwc
fonte
3
Enquanto isso para iOS é chamado iOS UITesting Bundle (usá-lo para testes de interface do usuário) ou iOS Unit Testing Bundle (é para testes de unidade ...)
kuzdu
184

Verifique se o arquivo em questão não está no destino principal, mas apenas no destino de teste. Somente o destino do teste terá essa estrutura para importar.

Aaron Zinman
fonte
16
Se isso ajudar. Selecione o seu destino 'Sem teste' -> Fases de construção -> Fontes de compilação. Verifique se o seu "ClassTest.swift" não está no destino de compilação normal.
Nick N
E se estiver no pacote principal e no pacote de teste, como você o remove do pacote principal.
James Robinson
1
Obrigado @NickN, você apontou o problema exato que eu estava tendo e isso foi corrigido agora!
Naishta
Se estiver no alvo de teste, não consigo acessar nenhum dos meus principais métodos de teste no meu alvo principal.
UKDataGeek
obrigado funcionou como um encanto. apenas removendo os arquivos de teste funcionou.
Ccr
32

Você acabou de adicionar seu arquivo / classe de testes ao destino principal e não ao destino por engano. Simples assim.

Solução:

1) Remova o arquivo de teste da lista "Fontes de compilação" na guia "Fases de construção" para o destino principal

2) Adicione o mesmo arquivo em "Compile Sources" na guia "Build Fhases" para o destino do teste

Ele deve resolver o problema

Alfishe
fonte
15

Eu recebo esse erro se criar um destino de estrutura dinâmica do macOS, vinculado a XCTest.framework (o destino é um destino de estrutura, não um destino de teste!).

Nesse caso, o problema é resolvido adicionando

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks

para "Configurações de compilação / caminhos de pesquisa da estrutura" do projeto.

Stanislav Pankevich
fonte
Perfeito! Obrigado!
Lance Tipo
9
Melhor: $(PLATFORM_DIR)/Developer/Library/Frameworkscaso você tenha várias versões do Xcode instaladas com nomes diferentes (por exemplo, versões de lançamento e beta).
22419 Robinson May
Obrigado @robmayoff, esta foi a solução correta ;-)
Oliver Pearmain
Esta é a resposta correta ao criar uma estrutura para suporte de teste.
Daniel Wood
7

Depois de muita solução de problemas e percorrer as páginas do Stack Overflow, como esta, consegui encontrar um detalhe que não foi mencionado nas outras páginas de solução de problemas do iOS Unit Test.

Se seu projeto usa CocoaPods, inclua seu destino de teste aninhado dentro do destino do aplicativo principal. Seu podfile pode não incluí-lo se você criou seu alvo de teste após a execução pod init. Seu podfile deve ser algo como isto:

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

Lembre-se de salvar seu podfile e executar pod install depois de fazê-lo.

Espero que ajude!

Orlando G Rodriguez
fonte
5

Talvez isso seja um pouco tarde, mas o que você precisa fazer é:

Clique em Arquivo> Novo> Destino> Pacote de Teste de Unidade iOS.

E então adicione seus testes lá. Isso funcionou para mim. O problema era que não selecionei criar testes de unidade quando criei meu projeto. Espero que isso ajude alguém.

Clinton D'Souza
fonte
2

Esse problema ocorre duas vezes no seu projeto.

  1. Quando você não adiciona UnitTestingBundle no seu projeto ao criar um novo projeto.
  2. Quando você instala o CocoaPods no seu projeto, nem sempre.

1: Resposta:

  • Vá para o arquivo Clique em Arquivo.

  • Então você vê a primeira opção Novo Clique nele.

  • Depois de clicar nele, você verá alguma opção, clique em Alvo.

  • E então, na barra de pesquisa, procure o pacote de teste de unidade IOS e adicione problema.

  • se o compilador não der permissão para adicionar isso, tente o segundo método quando for fornecido abaixo.

2. Resposta Problema CocoaPod:

  • Vá para o produto Clique no produto.

  • Clique em limpar ou pressione cmd + k.

  • Problema resolvido.

zeeshan Dar
fonte
2

Embora a resposta aceita resolva esse problema na maioria das vezes, há mais uma maneira de encontrar esse erro.

Se você já garantiu que:

Como apontado por @pwc @ nick-n e outros

  1. O ClassTest.swiftarquivo para associação de destino, garantindo que seja apenas anexado ao destino do Teste.
  2. O item nãoClassTest.swift está visível no seu destino principal do aplicativo> Criar fontes> Compilar fontes

Aqui está o que mais você pode conferir:

no seu .podspecsarquivo

Verifique se o seu source_filesnão inclui direta ou indiretamente o diretório de teste.

por exemplo :

s.source_files = ["Classes/**/*.{swift}", "Classes/**/*.{xib}"]
s.exclude_files = ["Classes/Exclude", "Classes/MyPodProjTests/"]

Observe que isso Classes/**/*.{swift}inclui tudo que substitui o fato de que o diretórioMyPodProjTests deve ser excluído.

Solução:

s.source_files = ["Classes/MyPodProj/**/*.{swift}", "Classes/**/*.{xib}"]

Nota: Este é um caso extremamente delicado e um erro completamente humano, mas achei que valeria a pena ressaltar.

thesummersign
fonte
Excelente observação, eu tinha incluído tudo no meu s.source_files. Obrigado!
Mauricio Chirino
1

Certifique-se de que a associação de destino esteja marcada para todos os módulos quando a estrutura de teste for selecionada. Você pode visualizar a opção Associação ao Destino selecionando Exibir-> Utilitários-> Mostrar Inspetor de Arquivos

carma
fonte
1

No meu caso, eu estava fazendo os testes para um pod privado, então no podspec era como:

s.test_spec 'Tests' do |test_spec|
test_spec.source_files = 'Tests/*.swift' end

Mas no Podfile eu esqueci de trazer a especificação do teste, como tal:

target 'MyApp' do
use_frameworks!
pod 'CoconutLib', '~> 1.0', :testspecs => ['Tests'] end
Hugo Jordao
fonte
0

Fiz tudo o que precede, mas ainda não tinha permissão para acessar os métodos que queria testar. Porém, antes de escrever qualquer caso de teste, o projeto foi construído uma vez e os métodos estavam acessíveis para teste. Então tente e deixe-me saber se resolveu algum problema.

sunil chayagol
fonte
0

Eu tive o mesmo problema e a solução para mim foi:

  1. Selecione meu esquema
  2. Editar esquema ...
  3. Quando a janela de configuração do esquema for aberta, selecione a guia esquerda denominada "Teste" para ser redirecionada aqui: insira a descrição da imagem aqui
  4. Como você pode ver, meus UITests não foram adicionados aqui, mas existem no meu projeto, então eu apenas toquei no botão mais e selecione meu destino como este: insira a descrição da imagem aqui
  5. Em seguida, toque no botão "Adicionar" e feche a visualização da configuração
  6. Termine com uma limpeza do projeto e tente novamente.
  7. E não se esqueça de verificar isso também: https://developer.apple.com/library/archive/qa/qa1954/_index.html

Espero que esta resposta ajude.

PS: um último pensamento no meu destino de teste nas configurações de compilação, tive que verificar essas propriedades que não foram configuradas corretamente:

DEBUG_INFORMATION_FORMAT = dwarf; 
ONLY_ACTIVE_ARCH = YES;
VALIDATE_PRODUCT = NO;
O. Boujaouane
fonte
0

Assim como @Alfishe mencionado acima:

Você tem que remover os arquivos de teste de Compiler SourcessobBuild Phases

Como mostrado abaixo


insira a descrição da imagem aqui

Suhaib
fonte
1
Se você fizer isso, não poderá executar os testes, tanto quanto eu sei
Juan Curti
0

Verifique a associação de destino da sua classe de teste.

Denis Kutlubaev
fonte
0

O problema é que Unit Testing Bundle como um alvo, deve ser criado antecipadamente

[Como adicionar]

yoAlex5
fonte