'Modul wurde nicht zum Testen kompiliert' bei Verwendung von @testable

146

Ich versuche, die neue @testableDeklaration von Swift 2 zu verwenden, um meine Klassen dem Testziel auszusetzen. Ich erhalte jedoch diesen Compilerfehler:

Geben Sie hier die Bildbeschreibung ein

Intervalsist das Modul, das die Klassen enthält, die ich verfügbar machen möchte. Wie werde ich diesen Fehler beseitigen?

hgwhittle
quelle

Antworten:

238

In Ihrem Hauptziel müssen Sie die Enable TestabilityBuild-Option auf Ja setzen.

Gemäß dem Kommentar von @earnshavian unten sollte dies nur für Debug-Builds gemäß den Apple-Versionshinweisen verwendet werden: "Die Build-Einstellung" Testbarkeit aktivieren "sollte nur in Ihrer Debug-Konfiguration verwendet werden, da Optimierungen verboten sind, bei denen keine internen Symbole exportiert werden die App oder das Framework " https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

sgaw
quelle
Hallo, ich erhalte den gleichen Fehler, sehe aber nicht die Option Testbarkeit aktivieren und verwende xcode 7. Irgendeine Idee, was ich tun soll?
user1601259
2
@ user1601259 - Sie finden die Option, indem Sie das Projekt der obersten Ebene auswählen, zu Build-Einstellungen gehen und unter der Überschrift Build-Optionen nachsehen.
Hgwhittle
@hgwhittle - Wenn ich das Projekt der obersten Ebene auswähle, sehe ich in den Build-Optionen nur "Debug-Informationsformat" und "Build-Produkt validieren". Wenn ich das Ziel in den Build-Optionen auswähle, wird "Eingebetteter Inhalt enthält schnellen Code" angezeigt. Das ist es. Wenn ich in Build-Einstellungen suche, kann ich es nicht finden. Liegt das an xcode 7?
user1601259
1
Möglicherweise haben Sie in Ihren "Build-Einstellungen" "Basic" ausgewählt. Wenn Sie auf der linken Seite "Alle" auswählen, wird "Testbarkeit aktivieren"
Array
1
Wie genau sollte dies für Release-Builds funktionieren, bei denen Tests ausgeführt werden (also erforderlich sind @testable), aber an den App Store gesendet werden müssen? Wenn Enable Testabilityes sich nur um Debug-Builds handelt, wie geht das um? Muss ich meinen Testcode zur Freigabe herausziehen?
Timgcarlson
15

In meinem Fall habe ich eine benutzerdefinierte Build-Konfiguration zum Testen (aufgerufen Test) und auch cocoapodsals Abhängigkeitsmanager verwendet

Ich musste die folgenden Zeilen am Ende meiner hinzufügen Podfile, um die Testbarkeit zu ermöglichen

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

Standardmäßig cocoapodssetzt ENABLE_TESTABILITYauf YESnur für Debugbaut

Tim
quelle
8

Für diejenigen unter Ihnen, die dies nur beim Ausführen von Xcode Profiler erleben: Wechseln Sie die Profilerstellungskonfiguration in Ihrer Schemaverwaltung zu der Konfiguration, für die die Testbarkeit aktiviert ist - und die in den meisten Fällen debuggt:

Geben Sie hier die Bildbeschreibung ein

Wladek Surala
quelle
4

Dies liegt wahrscheinlich daran, dass Ihr Hauptziel auf eingestellt Enable Testabilityist NO. Sie sollten es YESim Debug-Schema festlegen (das zum Ausführen Ihrer Tests verwendet wird).

Wenn Sie Karthago verwenden, kann dieses Problem durch den Import von Frameworks mit verursacht werden @testable, da diese mit einem Release-Schema erstellt wurden.

In den meisten Fällen ist es eine schlechte Praxis, Frameworks mit diesem Präfix zu importieren, damit Sie dies vermeiden können. Wenn Sie nicht können, sollten Sie Enable Testabilityim Release-Schema der Frameworks. https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

Samuel B.
quelle
2
Wie kann ich vermeiden, Frameworks mit @testable zu importieren? Was ist die gute Praxis hier?
Jonathan Cabrera
3

Ich habe diesen Fehler erhalten, als ich Tests mit Bitrise ausgeführt habe.

Im Gegensatz zu anderen Benutzern sagen, dies ist nicht pro - TargetBasis oder pro SchemaBasis, es ist pro ConfigurationBasis. Wählen Sie Target-> Build SettingsRegisterkarte -> Suchen nach testability-> Aktivieren Sie es in der von Ihnen verwendeten Konfiguration .

Bitte beachten Sie, dass Apple empfiehlt, dies für die Konfiguration zu aktivieren, die Sie zum Debuggen verwenden, nicht für AppStore.

rgkobashi
quelle
0

Die obige Lösung ist in Ordnung, wenn Sie Pods / Karthago verwenden. Wenn Sie jedoch Frameworks von iOS selbst verwenden, z. B. Kontakte, müssen Sie diesen Frameworks unter "Bibliothekssuchpfade" des Ziels Ihres Hauptprojekts einen Pfad hinzufügen. Geben Sie hier die Bildbeschreibung ein

nikBhosale
quelle
0

Wenn Sie versuchen, das Framework zu testen:

Gehen Sie zu Testziel -> Erstellungsphase -> Neue Kopierdateien erstellen -> Frameworks auswählen -> Alle rekursiv verwendeten Frameworks hinzufügen

Zaporozhchenko Oleksandr
quelle
0

Wenn Sie zufällig haben

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

Dann ist dies der richtige Weg.

    # 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
quelle
-3

Dies trat in meinen Projekten vor Xcode 8 nicht auf, aber nachdem ich auf Xcode 8 aktualisiert hatte, war ich ratlos.

Die hier veröffentlichten Antworten haben meine Probleme nicht gelöst. Für mich habe ich diese Tests einfach fallen gelassen, da sie nicht benötigt werden. Deaktivieren Sie also die Testschaltflächen:

Geben Sie hier die Bildbeschreibung ein Und jetzt ist der Fehler verschwunden.

Blaszard
quelle
1
Wenn Sie die Tests nicht benötigen, ist es möglicherweise besser, die Testziele aus Ihrem Projekt zu entfernen, als sie aus allen Builds zu entfernen.
Jonathan Cabrera