Wann müssen App-Quellen in Testziele aufgenommen werden?
In einem neuen Projekt, das ich mit diesem einfachen test
#import <XCTest/XCTest.h>
#import "ViewController.h"
@interface ViewControllerTests : XCTestCase
@end
@implementation ViewControllerTests
- (void)testExample
{
//Using a class that is not in the test target.
ViewController * viewController = [[ViewController alloc] init];
XCTAssertNotNil(viewController, @"");
}
@end
ViewController.h ist nicht Teil des test-target noch das kompiliert und läuft der Test ohne Probleme.
Ich denke, das ist, weil die Anwendung erst gebaut (als Abhängigkeit) dann die tests. Der linker dann zahlen Sie es aus, was die ViewController-Klasse ist.
Jedoch auf ein älteres Projekt, mit genau den gleichen test und ViewController-Datei, die build schlägt fehl, bei der linker-phase:
Undefined symbols for architecture i386: "_OBJC_CLASS_$_ViewController", referenced from: objc-class-ref in ViewControllerTests.o
Diese linker-Fehler tritt auf, selbst wenn eine frische XCTest unit-Test-target erstellt.
Dies zu umgehen, stattdessen ist es möglich, die Quellen in die app und der test-targets (Zecken beide Boxen im Bild oben). Dies bewirkt, dass build-Warnungen für doppelte Symbole in der simulator-system-log (öffnen Sie den simulator und drücken Sie cmd-/um dies zu sehen):
Class ViewController is implemented in both [...]/iPhone Simulator/ [...] /MyApp.app/MyApp and [...]/Debug-iphonesimulator/LogicTests.octest/LogicTests. One of the two will be used. Which one is undefined.
Diese Warnungen, die gelegentlich zu Problemen führen, illustriert das folgende Beispiel:
[viewController isKindOfClass:[ViewController class]]; //= NO
//Memory address of the `Class` objects are different.
NSString * instanceClassString = NSStringFromClass([viewController class]);
NSString * classString = NSStringFromClass([ViewController class]);
[instanceClassString isEqualToString:classString]; //= YES
//The actual class names are identical
Die Frage ist also, welche Einstellung(en) in der älteren Projekts sind, die anwendungsquelldateien in die test-target?
Zusammenfassung der Kommentare
Zwischen der arbeitenden und der nicht arbeitenden Projekt:
- Es gibt keinen Unterschied in der linker-Ausgabe (beginnend mit
Ld
). - Es gibt keinen Unterschied in der target-Abhängigkeiten (es ist 1 Abhängigkeit der test-target,das ist die app)
- Es gibt keinen Unterschied in den linker-Einstellungen.
InformationsquelleAutor der Frage Robert | 2014-02-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich einige Zeit damit verbracht herauszufinden.
Wenn Sie Lesen, diese Dokumentation finden Sie, dass Xcode hat zwei Modi für die Ausführung von tests. Logik Tests und Anwendungstests. Der Unterschied ist, Logik-tests, bauen Ihr eigenes Ziel mit Ihren Klassen und Symbolen direkt in Sie integriert. Die resultierende ausführbare Datei ausgeführt werden kann, in den simulator und test-Berichte die Ausgabe zurück zu Xcode. Anwendung von tests auf der anderen Seite bauen Sie eine dynamische Bibliothek verknüpfen, um Ihren code injiziert, die in der app zur Laufzeit. Dadurch können Sie tests ausführen, die iPhone-Umgebung und test Xib-laden und anderen Dingen.
Weil die Symbole fehlen aus dem test-target, wenn Sie die Verknüpfung der Quell-Dateien es erscheint Ihre älteren Projekt scheint ein test-target konfiguriert für Logik-tests, keine Anwendung (unit -) tests.
Als in diesen Tagen Xcode zu sein scheint versuchen Sie nicht, zwischen beiden zu unterscheiden und standardmäßig auf das erstellen einer Anwendung, die Tests Gegner lässt gehen Sie durch alle die Dinge, die Sie möglicherweise ändern, schalten Sie Ihre Logik-Test-Target in einem unit-test.
Ich werde auch davon ausgehen, dass Sie eine Anwendung Ziel-und nicht eine statische Bibliothek Ziel der Richtungen wird ein wenig anders sein.
$(SDKROOT)/Developer/Library/Frameworks
in Ordnung und mit keine zusätzlichen Anführungszeichen oder backslashes$(inherited)
$(DEVELOPER_FRAMEWORKS_DIR)
Diese Informationen mehr oder weniger kommt aus der oben verlinkten Dokumentation, aber ich aktualisiert die Schritte für Xcode 5.
EDIT:
Hmm 100% Hinweis was eph515 ist zu sagen über die debug-Symbole nicht sichtbar, aber Sie können auch prüfen wollen, dass jemand nicht Ihrem Schema der test-Aktion bauen, in der
Release
oder andere Konfiguration. Klicken Sie auf die Schema-Selektor ein wählen Sie "Bearbeiten" - Schema. Klicken Sie auf die test-Aktion und stellen Sie sicher, dass die Build-Konfiguration istDebug
Wenn Sie eine Statische Bibliothek Ziel
Also, wenn Sie eine statische Bibliothek Ziel haben Sie zwei Möglichkeiten:
1. Logik-Tests
2. Applikations-tests in einer host-Anwendung
1. Sie haben, um sicherzustellen, dass
Bundle Loader
undTest Host
sind leer für Ihre statische Bibliothek Ziel. Ihre Quellen müssen dann kompiliert werden, in die test-target als hätten Sie keine andere Art und Weise ausgeführt werden.2. Sie müssen eine neue app-Projekt in Xcode und fügen Sie Ihre statische Bibliothek-Projekt als ein Teilprojekt. Sie müssen dann manuell kopieren Sie die
Bundle Loader
undTest Host
build-Einstellungen von Ihrem Neuen App-test-target, um Ihre Statische Lib-test-target. Dann öffnen Sie das Schema für Ihr neues Test-App und fügen Sie Ihre test-target-tests-Aktion für die neue app.Zum ausführen des tests auf dein lib-Sie führen das test-Aktion für Ihre host-Anwendung.
InformationsquelleAutor der Antwort jackslash
Auf Xcode 6, ich war in der Lage, dieses problem zu beheben, indem Sie "Erlauben es, Tests durchzuführen Host-Anwendungs-APIs" in der test-target > allgemein - > Testen.
InformationsquelleAutor der Antwort yood
Lief ich in diese als gut und folgte jackslash Empfehlung, aber mit einem mehr dazu: Wählen Sie Ihr Hauptziel und sieht für Symbole Standardmäßig Ausgeblendet (unter Apple LVM-5.0 - Code-Generierung), wenn der Wert auf ja, ändern Nein. Dies scheint 'un ausblenden" alle Symbole der kompilierten Quellen, dass der unit-test-target sucht. Für mich funktioniert. Bitte stellen Sie sicher, dass Sie alle die Schritte, die jackslash umrissen.
InformationsquelleAutor der Antwort eph515
Die Antwort war eine Kombination von jackslash und eph515 Antworten.
Als in eph515 Antwort
symbols hidden by default
sollte Nicht für die debug.Auch
deployment postprocessing
sollte Nicht für die debug.Auch alle Bibliotheken, die in den test einbezogen werden Ziel sollte sein, aus dem Gerät entfernt testen. Alle, die gelassen werden sollte sind die 3 im screen shot plus alles, was ist spezifisch für unit-Tests.
Auch wenn es ein run-build-Skript build-phase am Ende der Liste, dann sollte es entfernt werden (da es sich um ein Artefakt der unit-Tests).
Dann alles tun, was in jackslash Antwort.
InformationsquelleAutor der Antwort Robert
In meinem Fall in Xcode 6.2 Fehler war in verschiedenen Architekturen im Projekt-Ziel und-tests Ziel.
Projekt Ziel hat, nur armv7 und armv7s-Architektur (da einige ältere Bibliothek)
Projekt-Tests Ziel hat, armv7, armv7s-und arm64-Architekturen.
Entfernen arm64-Architektur lösen dieses Problem für meinen Fall.
(vielleicht ist es auch nötig zu setzen "Architekturen" anstelle von $(ARCHS_STANDARD) $(ARCHS_STANDARD_32_BIT))
InformationsquelleAutor der Antwort Lukáš Mareda
Für mich war es einfach ein Fall von, kein test-targets Hinzugefügt, die für die Regelung.
Für die app Ziel gehen Sie zu Bearbeiten-Schema, klicken Sie auf Test auf der rechten Seite, dann fügen Sie ein test-target mit der + - Taste an der Unterseite:
InformationsquelleAutor der Antwort richy