Einrichten von Unit-Tests in gemischten Swift + Objective-C-Projekten

Dieser Artikel wird klein sein. Ich werde Ihnen sagen, welche Probleme beim Erstellen eines Ziels zum Testen in einem gemischten und ziemlich alten ObjectiveC + Swift-Projekt aufgetreten sind und wie ich sie gelöst habe.

Das erste, was verwirrend ist: Ein Fehler in einem Testziel kann sich auf den Start eines Autotests von einem anderen Testziel auswirken. Sie können beliebig viele Ziele zum Testen im Projekt hinzufügen. Diese basieren normalerweise auf dem Hauptziel des Projekts und werden automatisch zu seinem Startschema hinzugefügt. Wenn Sie also einen Autotest für dieses Schema ausführen, wird der Rest kompiliert, und ein Fehler in einem der Testziele stört den Start der anderen. Um diesen Effekt zu isolieren, können Sie verschiedene Schemata für verschiedene Testziele erstellen.

Ich werde einen sehr trivialen Screenshot nur aus Gründen der Klarheit beifügen:





Das nächste Problem sind die Abhängigkeiten zwischen Objecive-C und Swift.
In Ihrem Projekt wird erstellt:

MyProject-Bridging-Header.h : Diese Datei enthält die Namen der in Swift verwendeten ObjectiveC-Header-Dateien.
MyProject-swift.h : Erstellt implizit den Code für die in ObjectiveC-Klassen verwendeten Swift-Klassen.
MyProject-Prefix.pch : Die Vorkompilierungsdatei kann auch Abhängigkeiten auf verschiedene Arten enthalten, einschließlich Konstruktionen vom Typ:

#ifdef __OBJC__ #import "MyProject-Swift.h" #endif 

Ihre Autotests können auch solche Abhängigkeiten erstellen. Beim Hinzufügen der ersten schnellen Datei bietet Xcode an, eine Bridge-Header-Datei für dieses Testziel zu erstellen. Es funktioniert alles wie ein Zauber. Theoretisch sollte der Inhalt des Bridge-Header-Autotests die Hauptbrücke ergänzen, tatsächlich erfolgt jedoch ein Austausch. Um im Autotest auf alle Klassen des Projekts zugreifen zu können, gebe ich in dieser Option den Bridge-Header des Hauptziels an (Bild oben).

Gehen Sie zu Xcode Target -> BuildSetting und überprüfen Sie die folgenden Parameter:
Objective-C-Bridging-Header
Name des von Objective-C generierten Schnittstellen-Headers
Geben Sie die Hauptzieldateien an.

Wenn Sie jedoch den Hauptbrücken-Header ziehen, beginnen sich alle Abhängigkeiten zu dehnen. Daher müssen Sie auch die folgenden Parameter mit Daten aus dem Hauptprojekt ausfüllen:
Framework-Suchpfade
Header-Suchpfade
Bibliothekssuchpfad
Andere Linker-Flags
Runpath-Suchpfade müssen NICHT geändert werden.

Dann wurde ein anderes seltsames Problem entdeckt:
Aus irgendeinem Grund wird dem Testziel in älteren Projekten derselbe Produktmodulname wie dem Hauptziel zugewiesen. Dies hat das einsame ObjectiveC nicht gestoppt, aber beim schnellen Hinzufügen zum Projekt treten zwei Probleme auf.

Das erste Problem ist das in diesem Fall

 @testable import MyProject 

Die Autotest-Datei wird ignoriert und Sie können nicht auf Swift-Klassen zugreifen.

Das zweite Problem besteht darin, dass ein solches Ziel beim Kompilieren das MyProject-Swift des Hauptziels überschreibt und das Kompilieren anderer Ziele verhindert. Dieser Parameter muss umbenannt werden.

Daraufhin startete mein Autotest und konnte die Projektdateien verwenden, die ich Ihnen auch wünsche!
Ich arbeite nicht oft an der Einrichtung eines Projekts, daher sind alle praktischen Kommentare und Ratschläge zu diesem Thema willkommen.

Vielen Dank an alle, die es gelesen haben.

Source: https://habr.com/ru/post/de460961/


All Articles