Ich versuche, Unit Testing für mein Projekt einzurichten. Es ist eine vorhandene Objective-C-App, zu der ich kürzlich eine Swift-Klasse hinzugefügt habe. Ich habe die Dateien 'MyProject-Swift.h' und Swift Bridging (beide 'MyProject' und 'MyProjectTest') eingerichtet und kann die App mit Objective-C- und Swift-Code problemlos erstellen und ausführen.
Jetzt möchte ich jedoch einige Unit-Tests für die neue Swift-Klasse ausführen. Ich habe meine Testdatei eingerichtet und sie sieht folgendermaßen aus:
MySwiftClassTests.swift:
import UIKit
import XCTest
import MyProject
class MySwiftClassTests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// This is an example of a functional test case.
XCTAssert(true, "Pass")
}
func testPerformanceExample() {
// This is an example of a performance test case.
self.measureBlock() {
// Put the code you want to measure the time of here.
}
}
}
Ich erhalte diesen Fehler, wenn ich die App als Test ausführe:
'MyProject-Swift.h' file not found
Ich bin nicht sicher, warum dies nur passiert, wenn versucht wird, die Tests auszuführen. Irgendwelche Vorschläge?
ios
unit-testing
swift
header
JimmyJammed
quelle
quelle
Antworten:
Die Datei "MyProject-Swift.h" wird unter folgendem Pfad generiert:
"$(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources"
Am Ende füge ich dies zu den Header-Suchpfaden für mein Unit-Test-Ziel hinzu.
Auch als @hyouuu darauf hinwies, dass es sich um das bekannte Problem handelt, wird Apple hoffentlich am Ende eine gute Lösung anbieten. Bis ich glaube, dass wir diese obige Lösung verwenden müssen.
https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html
quelle
<Product Name> Tests
in Ihrem Testziel . Diese Lösung funktioniert jedoch nicht, wenn Ihr Produktname Leerzeichen enthält. Siehe meine Antwort unten für eine Lösung.$(TARGET_TEMP_DIR)
es nicht funktioniert. Ich endete mit$CONFIGURATION_TEMP_DIR/{myTargetName}.build/DerivedSources
Vielen Dank an @gagarwal, dass Sie das herausgefunden haben. In unserem Fall hat der Produktname ein Leerzeichen, das eingeblendet ist
$PROJECT_NAME
, also musste ich es hart codieren. Darüber hinaus können Sie mit$CONFIGURATION_TEMP_DIR
anstelle von$TARGET_TEMP_DIR
das übergeordnete Verzeichnis (../
) aus dem Pfad entfernen . Die Lösung besteht also darin, den Header-Suchpfaden in Ihrem Testziel Folgendes hinzuzufügen:Oder wenn Ihr Produkt keine Leerzeichen enthält:
quelle
Im Versionshinweis zu Xcode 6.1 wurde festgestellt, dass dies ein bekanntes Problem ist ... Zeichen ... Suchen Sie im Versionshinweis https://developer.apple.com/library/content/documentation/Xcode nach "-swift.h" /Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html
Bitte beachten Sie die Problemumgehung von @ gagarwal, unter der WORKS!
quelle
Ich hatte ein ähnliches Problem wie Sie, denke ich. Hier war mein Setup.
Ich hatte ein Objekt in Swift definiert:
Diese Klasse wurde dann im Initialisierer eines Objective-C-Objekts verwendet:
Dies führte dazu, dass meine Unit-Tests
Bar
nicht kompiliert wurden, da derMyProject-Swift.h
Header nicht real ist und das Unit-Test-Ziel ihn nicht sehen kann. Der von @hyouuu geteilte Versionshinweis ist zutreffend - aber ich teste keine Swift-Klasse, sondern eine Objective-C-Klasse!Ich konnte dies beheben, indem ich die Header-Datei so änderte, dass
Bar
stattdessen eine Forward-Klassenreferenz verwendet wurde:Ich habe dann eingeschlossen
MyProject-Swift.h
inBar.m
, und alles funktionierte - meine Tests von Objective-C - Objekten in Objective-C geschrieben zusammengestellt richtig und fortgesetzt ausgeführt wird , und ich kann neue Tests schreibt für Swift in Swift - Objekten.Hoffe das hilft!
quelle
Foo
API im Inneren zu verwendenBar.m
.MyProject-Swift.h
in die.m
Datei aufnehmen.Nachdem ich alles versuchte , konnte ich zu dem Thema finden, das , was für mich gearbeitet wurde tatsächlich läuft die App , obwohl es nach wie vor die ‚Module-Swift.h Datei nicht gefunden‘ Fehler zeigt wurde.
Es ging weg und meine App funktioniert einwandfrei. Ich denke, ich hätte früher darüber nachdenken sollen ... Der Fehler tritt immer wieder auf , aber nach dem Ausführen der App verschwindet er immer wieder. Das Problem ist für mich also nicht wirklich gelöst, aber ich kann vorerst weiter an anderen Themen arbeiten ...
quelle
Eine einfache
hat den Job für mich gemacht.
quelle
Seltsamerweise sah ich denselben Fehler, aber nur beim Targeting eines Geräts (nicht des Simulators). Vor dem Ausführen des Tests würde das rote Ausrufezeichen neben der Importanweisung für "MyProjectNameTests-Swift.h" angezeigt.
Komisch ist jedoch, dass XCode während der darauf folgenden Erstellungsphase tatsächlich die Datei "MyProjectNameTests-Swift.h" und den Test generiert, wenn ich den Test trotzdem ausführe (trotz dieses offensichtlichen Erstellungsfehlers) läuft gut!
Zumindest in meinem Fall waren die anderen Lösungen hier offensichtlich nicht erforderlich, obwohl ich glaube, dass sie auch funktionieren.
Ich sollte auch beachten, dass ich zuvor mein DerivedData-Verzeichnis gelöscht habe. Vielleicht ist das auch ein Schritt, den es sich zu versuchen lohnt.
quelle
mySwiftClassTests
(und alle anderen schnellen Klassen, die Sie in Ziel-c verwenden möchten) müssen markiert werden@objc
:quelle
Ich konnte es nicht zum Laufen bringen, indem ich den in anderen Antworten erwähnten Dateipfad hinzufügte, aber mir wurde klar, dass die Datei, in der sie sich beschwerte, nicht einmal getestet wurde. Ich musste es nur mithilfe der rechten Seitenleiste des Dienstprogramms vom Testziel entfernen.
quelle
Das Hinzufügen einer .swift-Datei zu diesem Ziel behebt das Problem.
quelle