„Moduł nie został skompilowany do testowania” podczas korzystania z @testable

146

Próbuję użyć nowej @testabledeklaracji Swift 2, aby udostępnić moje klasy celowi testowemu. Jednak otrzymuję ten błąd kompilatora:

wprowadź opis obrazu tutaj

Intervalsto moduł zawierający klasy, które próbuję ujawnić. Jak pozbyć się tego błędu?

hgwhittle
źródło

Odpowiedzi:

238

W swoim głównym celu musisz ustawić Enable Testabilityopcję kompilacji na Tak.

Zgodnie z komentarzem @earnshavian poniżej, powinno to być używane tylko w kompilacjach debugowania zgodnie z uwagami do wydania Apple: „Ustawienie Włącz kompilację testowalności powinno być używane tylko w konfiguracji debugowania, ponieważ zabrania optymalizacji, które polegają na nieeksportowaniu symboli wewnętrznych z aplikacja lub platforma ” https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

sgaw
źródło
Cześć, otrzymuję ten sam błąd, ale nie widzę opcji włączania testowalności i używam xcode 7. Masz jakiś pomysł, co mam zrobić?
user1601259
2
@ user1601259 - Możesz znaleźć tę opcję, wybierając projekt najwyższego poziomu, przechodząc do Ustawień kompilacji i patrząc pod nagłówkiem Opcje kompilacji.
hgwhittle
@hgwhittle - Kiedy wybieram projekt najwyższego poziomu, wszystko, co widzę w opcjach kompilacji, to „format informacji o debugowaniu” i „walidacja produktu do kompilacji”. Kiedy wybieram cel w opcjach kompilacji, widzę, że „osadzona zawartość zawiera szybki kod”. Otóż ​​to. Podczas wyszukiwania w ustawieniach kompilacji nie mogę go znaleźć. Czy to z powodu Xcode 7?
user1601259
1
Możliwe, że wybrałeś „Podstawowe” w „Ustawieniach kompilacji”. Jeśli wybierzesz „Wszystkie” po lewej stronie, zobaczysz „Włącz testowanie”
Tablica
1
Jak dokładnie powinno to działać w przypadku kompilacji wydań, w których testy będą uruchamiane (tak potrzebne @testable), ale trzeba je przesłać do App Store? Jeśli Enable Testabilityjest przeznaczony tylko do kompilacji debugowania, jak można to obejść? Czy muszę wyciągnąć kod testowy, aby go zwolnić?
timgcarlson
15

W moim przypadku użyłem niestandardowej konfiguracji kompilacji do testowania (wywoływanej Test), a także cocoapodsjako menedżera zależności

Musiałem dodać następujące wiersze na końcu mojego, Podfileaby umożliwić testowalność

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

Domyślnie cocoapodsustawia ENABLE_TESTABILITYsię YEStylko na Debugkompilacje

Tim
źródło
8

Dla tych z Was, którzy doświadczają tego tylko po uruchomieniu Xcode Profiler: zmień konfigurację budowania profilu w zarządzaniu schematem na taką, która ma włączoną testowalność - i w większości przypadków będzie to debugowanie:

wprowadź opis obrazu tutaj

Władek Surala
źródło
4

Dzieje się tak prawdopodobnie dlatego, że Enable Testabilityustawiono główny cel NO. Powinieneś ustawić to na YESw schemacie debugowania (który jest używany do uruchamiania testów).

Jeśli używasz Carthage, ten problem może być spowodowany importowaniem frameworków z @testable, ponieważ są one zbudowane przy użyciu schematu wydania.

W większości przypadków importowanie frameworków z tym prefiksem jest złą praktyką, więc można tego uniknąć. Jeśli nie możesz, powinieneś Enable Testabilityw schemacie wydawania frameworków. https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

Samuel B.
źródło
2
Jak mogę uniknąć importowania frameworków przy użyciu @testable? Jaka jest tutaj dobra praktyka?
Jonathan Cabrera
3

Zacząłem otrzymywać ten błąd podczas uruchamiania testów przy użyciu Bitrise.

W przeciwieństwie do innych użytkowników, to nie jest na Targetpodstawie lub na Schemapodstawie, to jest na Configurationpodstawie. Wybierz Target-> Build Settingszakładka -> szukaj testability-> Włącz ją w używanej konfiguracji .

Zwróć uwagę, że Apple zaleca włączenie tego w konfiguracji używanej do debugowania, a nie w AppStore.

rgkobashi
źródło
0

Powyższe rozwiązanie jest w porządku, jeśli używasz strąków / Kartaginy. Ale jeśli używasz frameworków z samego iOS "np. Kontakty", musisz dodać ścieżkę do tych frameworków w "Ścieżkach wyszukiwania bibliotek" celu twojego głównego projektu. wprowadź opis obrazu tutaj

nikBhosale
źródło
0

Jeśli próbujesz przetestować framework:

Przejdź do celu testowego -> Faza kompilacji -> Utwórz nową fazę kopiowania plików -> Wybierz frameworki -> Dodaj wszystkie rekurencyjnie używane frameworki

Zaporozhchenko Oleksandr
źródło
0

Jeśli przypadkiem masz

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

To jest sposób na zrobienie tego.

    # 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
źródło
-3

Nie miało to miejsca w moich projektach sprzed Xcode 8, ale po uaktualnieniu do Xcode 8 wprawiło mnie to w zakłopotanie.

Opublikowane tutaj odpowiedzi nie pomogły w rozwiązaniu moich problemów. Dla mnie po prostu porzuciłem te testy, ponieważ nie są potrzebne. Więc odznacz przyciski testowe:

wprowadź opis obrazu tutaj A teraz błąd zniknął.

Blaszard
źródło
1
Jeśli nie potrzebujesz testów, lepiej usunąć cele testowe z projektu zamiast usuwać je ze wszystkich kompilacji.
Jonathan Cabrera