iOS – ‘MyProject-Swift.h’-bestand niet gevonden bij het uitvoeren van Unit Tests voor Swift

Ik probeer Unit Testing in te stellen voor mijn project.
Het is een bestaande Objective-C-app, waar ik onlangs een Swift-klasse aan heb toegevoegd. Ik heb de ‘MyProject-Swift.h’- en Swift Bridging-bestanden (zowel ‘MyProject’ als ‘MyProjectTest’) ingesteld en ik kan de app prima bouwen en uitvoeren met zowel Objective-C- als Swift-code.

Nu wil ik echter enkele eenheidstests uitvoeren op de nieuwe Swift-klasse.
Ik stel mijn testbestand in en het ziet er als volgt uit:

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.
        }
    }
}

Ik krijg deze foutmelding wanneer ik de app als Test start:

'MyProject-Swift.h' file not found

Ik weet niet zeker waarom dit alleen gebeurt wanneer ik de tests probeer uit te voeren.
Suggesties?


Antwoord 1, autoriteit 100%

Het bestand “MyProject-Swift.h”wordt gegenereerd op het volgende pad:

"$(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources"

Uiteindelijk voeg ik dit toe aan Header Search Paths voor mijn Unit Test-doel.

Ook, zoals @hyouuu aangaf dat dit het bekende probleem is, zal Apple hopelijk aan het einde een goede oplossing bieden. Tot ik denk dat we deze bovenstaande oplossing moeten gebruiken.

https:// developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html


Antwoord 2, autoriteit 24%

Dank aan @gagarwal voor het uitzoeken hiervan. In ons geval heeft de productnaam een ​​spatie, die is samengevouwen in $PROJECT_NAME, dus ik moest het hard coderen. Bovendien, door $CONFIGURATION_TEMP_DIRte gebruiken in plaats van $TARGET_TEMP_DIR, kunt u de bovenliggende map (../) uit het pad verwijderen. De oplossing is dus om het volgende toe te voegen aan de Header Search Paths in uw testdoel:

"$(CONFIGURATION_TEMP_DIR)/Product Name With Spaces.build/DerivedSources"

Of, als uw product geen spaties bevat:

"$(CONFIGURATION_TEMP_DIR)/$(PROJECT_NAME).build/DerivedSources"

Antwoord 3, autoriteit 9%

Ik zag in de release-opmerking van Xcode 6.1 dat dit een bekend probleem is… teken…
Zoek naar “-swift.h” in de release-opmerking https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html

Tests die zijn geschreven in Objective-C kunnen de door Swift gegenereerde interfaces-header ($(PRODUCT_MODULE_NAME)-Swift.h) voor toepassingsdoelen niet importeren en kunnen daarom niet worden gebruikt om code te testen waarvoor deze header vereist is.

Tests voor Swift-code moeten in Swift worden geschreven. Tests die zijn geschreven in Objective-C voor framework-doelen hebben toegang tot de Swift-gegenereerde interfaces door de framework-module te importeren met @import FrameworkName;. (16931027)

Zie de tijdelijke oplossing van @gagarwal hieronder, die WERKT!


4

Vreemd genoeg zag ik dezelfde fout, maar alleen bij het richten van een apparaat (niet de simulator). Voordat u de test uitvoert, zie ik het rode uitroeptoon naast de invoerinstructie voor “MyProjectNameSTests-Swift.h”.

Echter, als ik gewoon doorgaat en de test toch kan uitvoeren (ondanks deze schijnbare build-fout), dan tijdens de bouwfase die daarna gebeurt, genereert Xcode daadwerkelijk het bestand “MyProjectNameStests-Swift.h” -bestand, en de test loopt prima!

Dus, althans in mijn geval, had er geen behoefte aan de andere oplossingen hier, blijkbaar, hoewel ik geloof dat ze ook werken.

Ik moet ook merken dat ik voorafgaand aan mijn DerivedData-directory verwijderde, dus misschien is dat een stap die ook de moeite waard is om te proberen.


5

Ik kon het niet laten werken door die FilePath toe te voegen die door andere antwoorden wordt genoemd, maar ik realiseerde het bestand waar het klaagde niet eens werd getest. Ik moest het gewoon van het testdoel verwijderen met behulp van de zijkant van de rechterhulpprogramma’s.


6

Het toevoegen van een .swift-bestand aan dat doelbevestigingsprobleem.

Other episodes