2015-11-17 12 views
19

Ich versuche, einige UI-Tests in meinem Projekt zu implementieren. Alles läuft gut, solange ich es einfach halte: notieren Sie den Testfall, fügen Sie einige Behauptungen hinzu und führen Sie dann den Test durch. Dies funktioniert gut, aber wenn ich versuche, aus meinem Test des Anwendungsmoduls zuzugreifen, der Linker einen Fehler wirft (siehe unten):Linker Fehler beim Zugriff auf das Anwendungsmodul in UI-Tests in XCode 7.1

in der Anwendungsquelldatei:

func foo() { 
    assert(true) 
} 

In der UI-Tests:

import XCTest 
@testable import MyApp 

func testExample() { 
    foo() 
} 

Fehler:

Undefined symbols for architecture i386: "MyApp.foo() ->()", referenced from: MyAppUITests.MyAppUITests.testExample (MyAppUITests.MyAppUITests)() ->() in MyAppUITests.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation)

Undefined symbols for architecture x86_64: "MyApp.foo() ->()", referenced from: MyAppUITests.MyAppUITests.testExample (MyAppUITests.MyAppUITests)() ->() in MyAppUITests.o ld: symbol(s) not found for architecture x86_64

Ich habe foud ähnliches Problem hier gemeldet: https://forums.developer.apple.com/thread/20609 aber keine Lösung. Scheint mir wie die @testable einfach nicht richtig funktioniert. Der Typ auf der developer.apple.com versuchte Abhilfe zu schaffen, indem er den Test-Host und den Bundle-Loader in den Einstellungen hinzufügte, aber ich denke nicht, dass dies der richtige Ansatz ist. Ich denke, die @testable sollte einfach alles funktionieren lassen, und es sieht im Moment nicht so aus. Jede Hilfe wird geschätzt!

+0

Sie sollten nicht so von Ihren UITests auf das Anwendungsmodul zugreifen .... aber wenn Sie wirklich wollen (bitte nicht), können Sie das Kontrollkästchen für Zielmitgliedschaft im Dateiinspektor aktivieren. Ich würde denken, dass '@ testable' in UITests nicht funktioniert, weil Sie nicht auf solche Funktionen zugreifen sollten. – JMFR

+2

@JMFR können Sie erläutern, warum nicht? Für mich ist das ein perfektes Szenario, besonders wenn Sie einige statische Variablen oder Methoden zum Einchecken Ihrer Tests haben.Was Ihren Vorschlag betrifft, die Zielmitgliedschaft zu überprüfen, dies wollte ich mit '@ testable' vermeiden. – lawicko

Antwort

3

Die UI-Tests sind ein separates Modul von der App, daher nicht in Ihrer App als eine logische Test ausgeführt würde. Die einzige Möglichkeit, Code zu teilen, besteht darin, alle App-Dateien, die Sie zwischen den beiden Modulen teilen müssen, zu kompilieren. diesen Blog prüfen, wie Sie das erreichen können, https://www.bignerdranch.com/blog/ui-testing-in-xcode-7-part-1-ui-testing-gotchas/

fand auch ein Radar hier eingereicht https://openradar.appspot.com/23116258

28

@testable import MainModule für UI-Test nicht funktioniert, obwohl es wäre der Code-Vervollständigung aktivieren (Sie können es fühlen funktioniert). Es wurde bisher nur für Unit-Tests entwickelt. Und es würde dazu führen, Versagen zu bauen, so etwas wie:

ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

dieses Problem umgehen, als auch die Quellcodedatei zu UI Testziel hinzufügen, dann wird es aus der Box (unter Umständen auch ohne @testable import).

Datei-Inspektor ->Ziel Mitgliedschaft -> überprüfen UI Testziel (zusätzlich zum Hauptziel)

Hoffnung Apple wird es bald beheben, so dass wir eine saubere Art und Weise haben, es zu benutzen .

+0

Nach ungefähr 2 Stunden, in denen ich meinen Kopf gegen die Wand schlug, rettete mich das, danke! – Josh

+0

@Josh froh, dass es geholfen hat :) –