'O módulo não foi compilado para teste' ao usar @testable

146

Estou tentando usar a nova @testabledeclaração do Swift 2 para expor minhas classes ao alvo de teste. No entanto, estou recebendo este erro do compilador:

insira a descrição da imagem aqui

Intervalsé o módulo que contém as classes que estou tentando expor. Como faço para me livrar desse erro?

hgwhittle
fonte

Respostas:

238

No seu destino principal, você precisa definir a Enable Testabilityopção de compilação como Sim.

Conforme o comentário de @earnshavian abaixo, isso deve ser usado apenas nas compilações de depuração, conforme as notas de versão da Apple: "A configuração de compilação Ativar testabilidade deve ser usada apenas na sua configuração de depuração, porque proíbe otimizações que dependem da não exportação de símbolos internos de o aplicativo ou estrutura " https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

sgaw
fonte
Oi, estou recebendo o mesmo erro, mas não estou vendo a opção ativar testabilidade e estou usando o xcode 7. Alguma idéia do que devo fazer?
user1601259
2
@ user1601259 - Para encontrar a opção, selecione o projeto de nível superior, vá para Configurações de compilação e procure o cabeçalho Opções de compilação.
precisa saber é o seguinte
@hgwhittle - Quando seleciono o projeto de nível superior, tudo o que vejo nas opções de compilação é "formato de informações de depuração" e "validação do produto de compilação". Quando seleciono o destino nas opções de compilação, vejo "o conteúdo incorporado contém código rápido". É isso aí. Quando procuro nas configurações de compilação, não consigo encontrá-lo. É por causa do xcode 7?
user1601259
1
É possível que você tenha selecionado "Básico" em "Configurações da compilação". Se você selecionar "Todos" no lado esquerdo, verá "Ativar testabilidade"
Matriz
1
Como exatamente isso deve funcionar para compilações de versões, onde os testes serão executados (tão necessários @testable), mas precisam ser enviados à App Store? Se Enable Testabilityfor apenas para compilações de depuração, qual é o caminho para contornar isso? Preciso retirar meu código de teste para lançamento?
timgcarlson
15

No meu caso, usei uma configuração de compilação personalizada para teste (chamada Test) e também cocoapodscomo gerenciador de dependências

Eu tive que adicionar as seguintes linhas ao final do meu Podfilepara permitir testabilidade

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            if config.name == 'Test'
                config.build_settings['ENABLE_TESTABILITY'] = 'YES'
            end
        end
    end
end

Por padrão cocoapodssets ENABLE_TESTABILITYa YESapenas para Debugconstrói

Tim
fonte
8

Para aqueles que estão enfrentando isso apenas ao executar o Xcode Profiler: alterne a configuração de criação de perfil no gerenciamento de esquemas para aquela com a testabilidade ativada - e que seria depurada na maioria dos casos:

insira a descrição da imagem aqui

Wladek Surala
fonte
4

Isso provavelmente ocorre porque seu destino principal Enable Testabilityestá definido como NO. Você deve configurá-lo YESno esquema de depuração (usado para executar seus testes).

Se você usa Carthage, esse problema pode ser causado pela importação de estruturas com @testable, porque elas são criadas com um esquema de liberação.

Na maioria das vezes, é uma prática recomendada importar estruturas com esse prefixo, para que você possa evitá-lo. Se você não pode, deve fazê-lo Enable Testabilityno esquema de liberação das estruturas. https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

Samuel B.
fonte
2
Como evitar importação de estruturas usando @testable? Qual é a boa prática aqui?
22818 Jonathan Cabrera
3

Comecei a receber esse erro ao executar testes usando o Bitrise.

Ao contrário de outros usuários, isso não é por Targetbase, ou por Schemabase, é por Configurationbase. Selecione Target-> Build Settingsguia -> procure testability-> Habilite-o na configuração que você está usando .

Observe que a Apple recomenda habilitar isso na configuração que você está usando para depuração, não na AppStore.

rgkobashi
fonte
0

A solução acima é boa se você estiver usando cápsulas / Cartago. Mas se você estiver usando estruturas do próprio iOS ', por exemplo, Contatos', precisará adicionar um caminho a essas estruturas em 'Caminhos de pesquisa da biblioteca' do destino do seu projeto principal. insira a descrição da imagem aqui

nikBhosale
fonte
0

Se você está tentando testar a estrutura:

Vá para o destino de teste -> Fase de construção -> Fase de criação de novos arquivos de cópia -> Escolha estruturas -> Adicionar todas as estruturas usadas recursivamente

Zaporozhchenko Oleksandr
fonte
0

Se por acaso você tiver

install! 'cocoapods',
         generate_multiple_pod_projects: true,
         incremental_installation: true

Então, este é o caminho para fazê-lo.

    # generated_projects only returns results if the we run "pod install --clean-install"
    # or install a pod for the first time

    installer.generated_projects.each do |project|
        project.build_configurations.each do |configuration|
            configuration.build_settings["ENABLE_TESTABILITY"] = "YES" 
        end
    end
Nuno Gonçalves
fonte
-3

Isso não ocorreu em meus projetos anteriores ao Xcode 8, mas depois da atualização para o Xcode 8, fiquei perplexo.

As respostas postadas aqui não resolveram meus problemas. Para mim, acabei de abandonar esses testes, pois não é necessário. Portanto, desmarque os botões de teste:

insira a descrição da imagem aqui E agora o erro foi apagado.

Blaszard
fonte
1
Se você não precisar dos testes, talvez seja melhor remover os destinos de teste do seu projeto em vez de removê-los de todas as compilações.
Jonathan Cabrera