2014-10-31 13 views
21

Ich habe mir viele Blogs angesehen und viele Dinge ausprobiert, um meine Swift-Komponententests in Xcode 6.0.1 (oder 6.1) zu verwenden. Ich versuche Klassen in meiner App Ziel zuzugreifen, damit ich diese Zeile geschrieben:Hinzufügen von Swift-Dateien zum Testen von Ziel- und Nicht-Einheitstests

var vc: LoginViewController! 

Natürlich bekomme ich die „Verwendung von nicht deklarierten Typ‚LoginViewController‘“ Fehler.

Ich versuche dann, LoginViewController zu meinem Testziel hinzuzufügen, aber dann bekomme ich "Verwendung von unaufgelösten Bezeichner" -Fehler auf anderen Klassen in meinem Projekt. Also versuche ich, diese Klassen zu meinem Testziel hinzuzufügen, aber ich am Ende mit einer scheinbar endlosen Fehlerquelle wie die Abbildung unten:

xcode swift errors

Deklarieren all meine Klassen als öffentliches, verursacht andere Fehler und scheint, wie schlechte Übung. Gibt es überhaupt Unit-Tests in einem Swift-Projekt, das auf vielen Frameworks und Klassen basiert? Ich möchte einfach mit etwas fast genau wie der Code in diesem article beginnen.

+1

Überprüfen Sie die Zielmitgliedschaft. Wenn dies bereits geschehen ist, versuchen Sie, das Projekt zu bereinigen, abgeleitete Daten zu entfernen und XCode neu zu starten. –

+0

Das hat bisher nicht funktioniert, das Hauptproblem, das ich jetzt mit Komponententests habe, ist die Verwendung eines statischen Frameworks von Drittanbietern. Das Hinzufügen von Klassen zum Testziel und das Aufrufen einer Funktion in diesem Framework führt zur Verwendung des nicht aufgelösten Bezeichners 'className' ' – tfrank377

+0

Überprüfen Sie, ob Ihr Bridging-Header-Klassenverzeichnis sowohl im App-Ziel als auch im App-Testziel aufgeführt ist. –

Antwort

32

Nach vielen Kopfschmerzen hinzuzufügen und diese auf Sparflamme setzen, fand ich, dass Das Hauptproblem bestand darin, dass beim Hinzufügen von Dateien zur Testzielmitgliedschaft die Objective-C-Klassen sich immer noch beschweren würden. Ich dachte, es war ein altes Kompatibilitätsproblem mit der neuen Art, wie Swift Unit-Tests durchführt, aber die Lösung war . Mein Testziel wusste nicht, dass es einen Bridging-Header gab. So habe ich einen Verweis darauf in meinem Testziel Build-Einstellungen, etwa so:

test target bridging header

Es ist nun einfach und offensichtlich scheint, aber die Fehler waren nicht hilfreich. Keine anderen Lösungen, die ich für Swift-Unit-Tests sah, deuteten darauf hin, dass dies ein Problem sein könnte, aber jetzt weiß ich es.

Tl; dr

Für Tests Einheit in Swift zu arbeiten, muss das Testziel weiß alles, was das App Ziel kennt, so fügen Sie auch einen Verweis auf Ihre Überbrückung Header in Ihrem Testziel (falls zutreffend).

+0

Ich habe zu viele Stunden damit verbracht zu verstehen, warum meine Tests nicht funktionierten. Vielen Dank! – dccarmo

+1

Sie müssen möglicherweise den Filter von "Basic" zu "All" unter den Build-Einstellungen Ihres Testziels ändern, damit dies angezeigt wird. – Andrew

15

ich Xcode bin mit 6.1

Sie benötigen eine rasche Datei auf die target membership des Testzieles

enter image description here

+0

Ich brauche es wirklich auf Xcode 6.0 für automatisierte Build-Gründe zu arbeiten, aber ich habe dies in Xcode 6.1 versucht und es gibt mir "Verwendung von nicht aufgelösten Bezeichner 'Klassenname'" Fehler. – tfrank377

+7

Es muss einen besseren Weg geben, dies zu tun. Das Hinzufügen von Code zum Testziel verlangsamt den Test erheblich. In Objective-C mussten Sie Ihre Quellen nicht zum Testziel hinzufügen. –

13

Wenn Sie Xcode 7 verwenden, gibt es jetzt einen viel besseren Weg, um mit @testable import {ModuleName} umzugehen.

Stellen Sie sicher, dass das Modul, das Sie testen möchten, die Build-Einstellung Enable Testability auf YES hat.