“Não existe esse módulo” ao usar @testable em testes da Unidade Xcode

168

Atualizei recentemente para o Xcode 7 beta 5. Tentei adicionar um teste de unidade a um projeto anterior, mas estou recebendo a mensagem de erro "Nenhum módulo [myModuleName]" na @testable import myModuleNamelinha.

insira a descrição da imagem aqui

eu tentei

  • Limpando o Projeto com a OptionPasta de Construção Limpa
  • verificando se "Ativar testabilidade" (depuração) foi definido como Sim nas opções de compilação
  • excluindo o destino dos testes e adicionando novamente o pacote de testes da unidade iOS

Nada disso funcionou para este projeto (mas eu testei para trabalhar em outro projeto). Alguém mais teve esse problema e resolveu?

Suragch
fonte
Se você estiver construindo a partir da linha de comandos com o xcodebuild, adicione o sinalizador -workspace ao seu comando build. Eu resolvi esse problema no meu travis construir dessa maneira.
Victor 'Chris' Cabral

Respostas:

210

Por favor, verifique o nome do módulo com o qual você tenta importar @testable import "ModuleName". O nome do módulo deve ser o mesmo emTarget->Build Settings-> Product Module Name

Voda Ion
fonte
5
Na maioria dos casos, trata-se do nome do módulo do produto. Verifique spacee_
onmyway133
5
tenha cuidado com -e _. Um dos meus projetos tem menos -no nome, mas o módulo tem sublinhado _em vez
berílio
4
eu usei a ""idéia, e obteveExpected identifier in import declaration
abbood
1
@ onmyway133 estava super perto. No meu caso, eu tinha um nome de módulo de produto diferente do nome do meu projeto. Para encontrar o seu nome do módulo ir para Build Settingsselecionar o seu projeto (não o teste ou teste de UI), em seguida, procurar PRODUCT_MODULE_NAMEtudo o que aparecer não é o que deve ir atrás@testable import
jonmecer
115

A resposta que funcionou para mim

A resposta foi que eu tive alguns erros no meu projeto que estavam fazendo a compilação falhar. (Era apenas o bug padrão do seu dia-a-dia no código.) Depois que corrigi os erros e fiz outra limpeza e compilação, funcionou.

Observe que esses erros não apareceram no início. Para que eles apareçam:

  • Comente seu arquivo de teste inteiro que está fornecendo o erro "Nenhum módulo".
  • Tente executar seu projeto novamente.

Se houver outros erros, eles devem aparecer agora. Corrija-os e remova o comentário do código do arquivo de teste. O erro "Não existe esse módulo" desapareceu para mim.


Caso isso não resolva o problema para outras pessoas, você também pode tentar o seguinte:

Limpe a pasta de compilação

Abra o menu Produto, mantenha pressionado Optione clique em "Limpar pasta de compilação ..."

insira a descrição da imagem aqui

Verifique se Ativar testabilidade está definido como Sim

No Navegador de projeto, clique no nome do seu projeto. Selecione Configurações de compilação e role para baixo até Opções de compilação. Verifique se Ativar testabilidade é Sim (para depuração).

insira a descrição da imagem aqui

Exclua e adicione novamente seu destino de testes

Se você fez as outras coisas, meu palpite é que provavelmente não precisa fazer isso. Mas, se o fizer, lembre-se de salvar todos os testes de unidade que você já escreveu.

Clique no nome do seu projeto no Navegador de Projeto. Em seguida, selecione seu destino de testes. Clique no botão de menos (-) na parte inferior para excluí-lo.

insira a descrição da imagem aqui

Em seguida, clique no botão de adição (+) e escolha Pacote de testes de unidade do iOS para adicioná-lo novamente. Como você pode ver, você também pode adicionar um pacote de testes de interface do usuário da mesma maneira.

Algumas outras idéias

  • Verifique se todas as classes necessárias são membros do seu destino de teste.
  • Verifique se você adicionou todas as bibliotecas necessárias.
  • Verifique se o nome do módulo está escrito corretamente (consulte esta resposta ).

Ou...

Deixe um comentário ou resposta abaixo se você encontrou algo que funcionou.

Relacionado

Suragch
fonte
2
Tendo todos os mesmos problemas aqui, com o Xcode 7 beta 5. Infelizmente, as etapas acima parecem não resolvê-lo - o módulo ainda está considerando como "nenhum módulo 'Utilitário'". A única diferença das capturas de tela é que estou tentando fazer isso funcionar com a pasta de testes de interface do usuário (GlimpulseUITests no meu caso). @Testable talvez não funcione com o destino de teste da interface do usuário?
Zac
5
*** IMPORTANTE *** Se você excluir e adicionar novamente o alvo de teste, ele recriará um modelo de teste em branco substituindo os testes existentes. Salve as fontes de teste antes de fazer isso.
22915 pauln
2
Para mim, mesmo minhas aulas individuais não estavam sendo mostradas durante a digitação ... Eu finalmente fiz Product> Clean, reiniciei o XCode. Quando reiniciou, deu alguns segundos para concluir a indexação e, em seguida, voila todas as minhas referências apareceram sem a necessidade de incluir cada classe como um membro do alvo de teste.
Rajive Jain
1
Além disso, se você ainda não tentou isso, clique na estrutura que está faltando à esquerda e, à direita, selecione "Associação ao Destino" e inclua-a no seu objetivo de teste de unidade.
Albogdano
3
Vá para criar configurações do seu destino principal -> "Nome do módulo do produto" e veja se ele corresponde ao nome do módulo que você tenta importar no seu teste.
F0rz 07/04
64

O problema para mim foi que o destino de implantação do iOS dos testes não estava definido para ser o mesmo do destino principal. Portanto, verifique isso.

No seu alvo de teste:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>
Jess
fonte
Depois de fazer isso, eu tinha que definir Enable Bitcodepara Noo Bundle de teste.
Pableiros
2
Lol ele funciona, mas o quão estúpido do Xcode que doens't lançar um erro diferente
J. Doe
31

Então foi assim que eu comecei a fazer meu código funcionar depois de tentar todas as soluções sugeridas nas sugestões anteriores.

  • Defino 'Ativar testabilidade' como 'SIM' nas Configurações de compilação do projeto
  • Também defino 'Define Module' como 'YES' nas Configurações de compilação do meu projeto.
  • Para os arquivos .swift regulares no meu projeto, digamos MyApp , eu estava escrevendo casos de teste, tenho os destinos " MyApp " e " MyAppUnitTests " principais verificados em Associação ao destino .
  • Selecionei meu (s) arquivo (s) de teste de unidade, declarei o ' @testable import MyApp ' na parte superior, abaixo de ' import XCTest ' e verifiquei apenas "MyAppUnitTests" em Associação ao destino

E tudo funcionou como charme. Espero que isto ajude.

Vick Swift
fonte
8
Ativar testabilidade e módulo de definições é o que fez o truque. Não precisei alterar as associações de destino para arquivos * .swift regulares.
George Yacoub 02/02
Eu executei todas as etapas acima, mas ainda tenho o erro do módulo. meu projeto é uma mistura rápida-obj c embora
Mikael
@Mikael, você está escrevendo testes apenas para os arquivos Swift na sua base de códigos de objetos Objc / Swift? (Eu pergunto porque, na última vez que verifiquei, acho que a 'importação @ testável' funcionou apenas para escrever casos de teste para apenas arquivos Swift, mesmo na mistura de bases de código Obj-c / Swift. Provavelmente já deve ter mudado. Alguém me corrija se eu estiver errado aqui).
Vick Swift
6
Eu encontrei o meu problema. Isso ocorreu porque a Arquitetura Válida do meu destino de Teste não era a mesma que a configuração da Arquitetura Válida do meu principal destino. Agora funciona. Btw, eu estou testando classes somente Swift no meu caso, eu não dar-lhe uma tentativa para Obj-c
Mikael
3
Você não deve adicionar os arquivos rápidos do aplicativo ao seu destino de teste, pois o conteúdo deles será duplicado ao executar testes.
Przemysław Wrzesiński
18

Uma dica a se observar é que, se o nome do seu módulo tiver um caractere de hífen -, você deverá fazer referência a ele com uma barra inferior _. Por alguma razão, eu suspeitava que isso pudesse ser um problema e esse era realmente o meu problema.

por exemplo. @testable import Ocean-Swifttorna-se@testable import Ocean_Swift

Apenas mais uma coisa, se você usar a @testablesintaxe, não inclua seu código de produção no seu destino de teste. Eu descobri que isso causará estranheza inexplicável.

smileBot
fonte
1
todos os caracteres não alfanuméricos também podem precisar ser substituídos pelo sublinhado. Meu alvo estava neste formato App (Dev), o módulo testável tornouApp__Dev_
mushcraft
11

Isso parece ser um erro nas configurações de compilação dos dois destinos. Você precisa garantir que:

  • ENABLE_TESTABILITY é igual a Sim para ambos os destinos.
  • O PRODUCT_MODULE_NAMEvalor do alvo do teste deve diferir do valor do aplicativo.
yageek
fonte
2
Isso funcionou para mim. Eu estava usando o nome do módulo errado. Eu estava removendo o espaço em vez de adicionar um _. VERIFIQUE DUPLO OS NOMES DO MÓDULO DE PRODUTO NAS CONFIGURAÇÕES DO
CONSELHO
9

Outra coisa a verificar: se você tem um projeto Objective-C, mas está escrevendo testes de unidade no Swift, verifique se o alvo principal usa pelo menos um arquivo Swift!


Mais informações:

Eu estava trabalhando em um projeto Objective-C, mas queria escrever testes de unidade no Swift.

Adicionei um arquivo Swift ao destino principal para gerar o arquivo ProjectName-Bridging-Header.h necessário, escrevi meus testes e tudo estava funcionando corretamente.

Mais tarde, apaguei o arquivo Swift porque pensei que não precisava dele (todo o código do alvo principal está no Objective-C ... eu estava apenas escrevendo testes no Swift).

Eu não notei um problema até mais tarde, depois que fiz uma "pasta de compilação limpa / limpa" e o problema "No Such Module" apareceu. Depois de alguns arranhões, adicionei um novo arquivo Swift em branco e o problema desapareceu.

Eu testei várias vezes com / sem o arquivo Swift, e ele só funciona com ele ... então, vou precisar deixar o arquivo em branco no projeto, converter alguns Objective-C em Swift ou adicionar alguns novo código para o projeto escrito em Swift.

Jim Rhoades
fonte
1
!! após 3 horas de limpeza excluindo dados recuperados, limpando, começando do zero 3 vezes, achei seu comentário que resolveu meu problema !!! Obrigado !!!!
21717 Maryam Fekri
Você sabe como acessar as classes Objective-C nas classes de teste Swift, porque importo o módulo do projeto e não há erro nisso, mas ele ainda não reconhece minhas classes Objective-C. devo fazer outra coisa?
Maryam Fekri 21/11
Um ponto adicional que eu gostaria de acrescentar, embora meu projeto na maior parte do ObjC tenha pelo menos um arquivo Swift, não havia cabeçalho de ponte para o meu destino. Seguir as instruções no link a seguir, sob o título "Importar código dentro de um destino de aplicativo", resolveu acessar as classes ObjC a partir dos testes Swift. developer.apple.com/documentation/swift/…
palmi
Corri para esta questão. No entanto, estou interessado em encontrar uma maneira de evitar a inclusão do arquivo Swift, se possível, então fiz a pergunta aqui: stackoverflow.com/q/62965954/211292
ThomasW
Na verdade, parece que se você não incluir a @testable import Foolinha, seus testes de unidade deverão ser executados corretamente.
ThomasW
9

Para aqueles que rolaram até a última resposta e ainda nada funcionou, eis o que fez por mim depois de seguir todos os conselhos de outras respostas. Estou usando o Xcode 11:

O que causou o problema no meu caso foi que mudei o nome do produto

  1. Alterei meu nome do produto nas configurações de compilação do meu destino principal para "novo nome"
  2. Eu tive que selecionar novamente o aplicativo host para o meu destino de teste
  3. Eu não sabia que alterar o nome do produto também mudaria o Nome do módulo do produto , que é o usado para a importação do módulo nos meus arquivos de teste. Alterei minha importação da seguinte maneira:

    @testable import New_Name

  4. Funcionou

Espero que ajude

SwissMark
fonte
7

Depois de passar alguns dias nessas questões, finalmente consegui trabalhar com meu projeto. O problema estava no Bridging Header - o caminho no destino dos testes não pode ficar vazio se você estiver usando o Bridging Header no seu destino principalO cabeçalho da ponte não pode estar vazio !!!

Espero que isso economize algum tempo para alguém.

Igor P
fonte
5

Verifique se, na configuração de compilação do esquema de teste, o destino do teste está na lista.

Ao lado do botão play, selecione o esquema de teste e, em seguida, Editar esquema ..., vá para a seção Build, clique em mais + e selecione o alvo com o qual você deseja testar.

No meu caso, temos um alvo interno com o qual desenvolvemos (algumas pequenas diferenças) e, após uma mesclagem, ele foi removido da configuração de teste.

Editar esquema de teste

BrianHenryIE
fonte
5

Aqui está outra coisa a verificar que não está listada. Para mim, isso tinha algo a ver com a minha equipe, talvez porque o agente da nossa equipe ainda não tivesse concordado com o último Contrato de Licença! Depois que eu selecionei uma equipe diferente nas configurações gerais do meu destino, e especifiquei um destino de implantação específico como 12.1 ou 11.0, de repente o aviso "No Such Module" desapareceu.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Dave Levy
fonte
4

No meu caso, tive três problemas. A primeira foi que eu tive que especificar o caminho de importação em:

Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths

A segunda foi que eu estava usando Pods e tive que importar esses pods para meus testes também usando:

target 'MyAppTests' do
    inherit! :complete
end

O terceiro, como eu estava usando um cabeçalho de ponte no meu destino, tive que especificar que o cabeçalho de ponte fosse o mesmo para o teste.

el3ankaboot
fonte
2

Meu problema era que a classe que eu queria testar deveria estar em um módulo separado (API Client), mas a classe era na verdade um membro do destino do aplicativo e não o destino da estrutura. Alterar a associação de destino da classe fez com que o erro de importação desaparecesse!

Maciej Swic
fonte
2

Ambiente: Xcode Versão 9.0 (9A235)
Cenário: Testando uma estrutura de código-fonte aberto.

Eu tive o mesmo problema: 'Não existe esse módulo'.

Solução:

  1. Selecione o alvo de teste.
  2. Selecione Fases de construção
  3. Adicione a estrutura a ser testada via Link Binary ...

insira a descrição da imagem aqui

Aqui está o arquivo de teste: insira a descrição da imagem aqui

Frederick C. Lee
fonte
2

Eu tive esse mesmo problema. Limpar a pasta de compilação e reiniciar o Xcode não funcionou.

O que funcionou para mim foi garantir que a configuração para "Criar somente arquitetura ativa" do seu destino e esquema de teste corresponda à configuração do destino e esquema do seu aplicativo.

palmi
fonte
2

Eu segui os passos acima, que funcionaram. No entanto, meu projeto teve mais alguns problemas. Recebi esse aviso e não pude acessar as classes do meu projeto principal para testar no meu destino de teste.

Testa parte do módulo - ignorando a importação

Descobri que o Nome do módulo do produto de destino de teste (YourTestTarget -> Configurações de compilação -> procurar product module) não pode ser o mesmo nome que o nome do seu projeto.

O nome do módulo do produto para o destino de teste não pode ser o mesmo nome que o nome do seu projeto

Depois de alterar o nome do módulo do produto para o meu destino de teste, tudo funcionou.

insira a descrição da imagem aqui

Bryan Norden
fonte
1

Minha solução está aqui.

Primeiro, clique em OdeAlSwiftUITest.swift e verifique o Project TargetName na associação de destino.

insira a descrição da imagem aqui

eyup
fonte
7
Isto está errado. Nunca adicione seus arquivos de teste ao seu destino.
smileBot
1

insira a descrição da imagem aqui

Clique no MyAppTests.swift no navegador do projeto e clique no painel direito, verifique seu módulo na associação de destino. Funciona na minha.

Firda Sahidi
fonte
1

Tentei todas as respostas aqui, mas a bandeira vermelha não desapareceu. Mas consegui que ele funcionasse apenas "executando" um teste vazio de qualquer maneira e esclareceu.

Coisas que eu gostaria de ter certeza de que estão feitas:

  • Aplicativo host
  • @testable import "Module_name" (verifique se o nome do módulo está correto)
  • Certifique-se de que o destino de implantação do teste seja o mesmo do projeto
  • O XCTest não precisa ter associação ao Target
Alexander
fonte
0

Para mim, a solução foi renomear @testable import myproject_ios para @testable import myproject depois de atualizar o nome do produto alvo myproject-ios em Build Settings / Packaging / Product Name / de $ {TARGET_NAME} para myproject.

Matthias
fonte
0

Isso foi corrigido para mim quando alterei o Destino de Implantação de 9.3 para 11.0.

Geral> Destino de Implantação> "11.0"

jacob_g
fonte
Isto pode ser mais o caso de mudar simuladores, mas isso foi trabalhado para mim também
RolandasR
0

Se você estiver usando o xcodebuild e encontrar esse problema, considere adicionar um sinalizador da área de trabalho ao comando build.

Alterou isto

$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test

Para isso

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test
Victor 'Chris' Cabral
fonte
0

No destino do teste das configurações de compilação, verifique o teste do host, use o nome definido no PRODUCT_NAME. É esse nome que você deve usar nas classes de teste.

Recomendo não alterar o PRODUCT_NAME (corresponder ao nome do destino principal)

Sam
fonte
-1

Conforme descrito nesta resposta, eu estava adicionando testes Swift a um projeto apenas de Obj-C. A solução foi adicionar uma classe Swift fictícia, após a qual o Xcode solicitaria a adição de um cabeçalho de ponte e a remoção da classe Swift. Tudo estava bem depois disso.

funkybro
fonte
-1

Além das outras coisas listadas, tive que adicionar o arquivo com a classe que estava tentando testar nas minhas fontes de compilação para o módulo de teste de unidadeinsira a descrição da imagem aqui

Matt D
fonte
-1

Eu acho que isso pode ter acontecido porque excluí os testes de exemplo.

Removai o pacote de teste da unidade e o adicionei novamente, como mostrado nas figuras abaixo, e tudo estava bem novamente.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Declan McKenna
fonte