Klasse Foo ist in MyApp und MyAppTestCase implementiert. Einer der beiden wird verwendet. Welches ist undefiniert
Neulich habe ich angefangen Sie Komponententests für meine Anwendung. Dieses Projekt (in Xcode4) erstellt wurde, ohne ein unit test bundle so hatte ich es eingerichtet.
Ich folgte den Schritten hier: http://cocoawithlove.com/2009/12/sample-mac-application-with-complete.html
Und Es hat funktioniert gut für einfache Klassen, aber jetzt versuche ich zum testen einer Klasse, die von einem anderen abhängt, und dass auf einer anderen, etc.
Zuerst bekam ich einen linker-Fehler, so dass ich Hinzugefügt *.m
Dateien in den test-Fall-Ziel, aber jetzt bekomme ich eine Warnung für jede Klasse, die ich bin versucht zu testen:
Foo-Klasse implementiert ist, in beiden MyApp
und MyAppTestCase. Einer der beiden wird
verwendet werden. Die eine ist nicht definiert.
Frage ich mich, warum ist das so? Wie kann ich dieses Problem lösen? Vielleicht habe ich etwas verpasst bei der Einstellung der unit-test-target?
Bearbeiten - Die Lösung
- Set "Bundle Loader" richtig zu
$(BUILT_PRODUCTS_DIR)/AppName.app/AppName
- Set "- Symbole Standardmäßig Ausgeblendet" KEINE (in Build-Einstellungen der Ziel-Anwendung). Dies ist, wo der linker-Fehler kommen daher, weil es JA standardmäßig!. Ich habe gekämpft, mit diesem für so lange!.
Quelle: Linking-Fehler für die unit Tests mit XCode 4?
InformationsquelleAutor der Frage nacho4d | 2011-05-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
da beide Bilder (die app und das unit test bundle) definieren Sie die Implementierung der Klasse. die Klasse dynamisch geladen in die objc-runtime. die objc-runtime verwendet einen flachen Namensraum. wie das funktioniert:
den typische problem hier ist, dass Sie zurückgegeben werden, die eine Umsetzung - Ihre app wird wahrscheinlich Abstürzen, wenn die Art der Konflikte (wenn die Klasse nicht aus der gleichen Quelle-Datei).
Sie in der Regel vermeiden, indem Sie entweder umbenennen einer Klasse, oder exportieren Sie die Klasse in ein Bild. umbenennen der Klasse offensichtlich nicht für Ihren Fall. Sie haben eine Datei
Foo.m
die kompiliert wird, exportiert und geladen werden, indem zwei Bilder, wenn es sein sollte, in einem.diese interpretiert werden sollten, die Sie als symbol duplizieren linker-Fehler. auch wenn die Umsetzung der gleichen Quelle-Datei (und die Implementierung ist die gleiche) - das ist ein problem, das Sie beheben muss.
wenn
Foo.m
ist eine Klasse app, die Sie haben, um Sie zu entfernen (nicht kompilieren und link)Foo.m
aus dem unit-test. wenn Sie Teil der unit test, dann nicht kompilieren und verknüpfen es in der unit-test-target.befolgen Sie dann die Anweisungen in der post für die Verknüpfung/das laden der unit-test für die app. es ist in diesem Allgemeinen Bereich der post: wo "WhereIsMyMac" ist der name der Anwendung, Sie sind unit-Tests. Dies lässt die Prüfung Ziel-link vor der Anwendung (so Sie nicht bekommen, die linker-Fehler beim kompilieren). der wichtige Teil ist, dass Sie Ihre test-Dateien kompiliert werden, die in der unit-test-target (nur), und der app-Klassen werden kompiliert und verbunden in der app. Sie können nicht nur fügen Sie den link und laden dynamisch.
Des Artikels, den Sie verlinkt:
den Teil, dass Sie falsch sind, ist wahrscheinlich der link, und laden Sie die Phasen der unit test bundle.
InformationsquelleAutor der Antwort justin
Wenn Sie mit Cocoapods, Ihre podfile muss nur die Abhängigkeiten in den Abschnitt für die wichtigsten Ziel -, nicht der test-targets. Wenn Sie hinzufügen, duplizieren Abhängigkeiten für die test-Ziele, erhalten Sie die OP ' s Fehlermeldung.
InformationsquelleAutor der Antwort Richard
Für mich, alles was ich brauchte zu tun war, deaktivieren Sie das Kontrollkästchen, das macht die Klasse " Foo " ein Mitglied der unit-test-target. Es sollte nicht ein Mitglied der beiden Ziele, und sollte wie folgt Aussehen:
In Fall können Sie nicht sehen, das Bild, es ist ein screenshot von Xcode "Target Mitgliedschaft" angezeigt. Es gibt zwei Ziele: einen mit einem "A" Symbol der Anwendung und der name des Tests. Der andere ist der unit-test-target, und hat ein unit-test-Symbol:
InformationsquelleAutor der Antwort Steve HHH
Mir dies passiert ist, weil ich bereitgestellt, um das Gerät und dann an den simulator, wie ich NSZombies aktiviert. Die Lösung war der Schalter im simulator configuration & machen Sie einen Produkt -> Reinigen Sie dann den-Schalter, um die Geräte-Konfiguration & das gleiche zu tun. Fehler ging Weg. Es ist zu tun mit bauen cache.
InformationsquelleAutor der Antwort Geoff H
Der Grund dafür ist, dass Sie überschreiben
RUNPATH_SEARCH_PATHS
Ihrer App-Target der build-Einstellung definierte Ziel.Lösung:
InformationsquelleAutor der Antwort Bartłomiej Semańczyk