2015-11-13 3 views
13

Im Versuch zu testen einig Swift-Klasse (@objc Klasse) in meinem Vermächtnis ObjC Code gefunden. Ich importiere "UnitTests-Swift.h" in meinen Testklassen.Module "MyApp" nicht in Unittest-Swift

Dann bekomme ich diesen Fehler:

Module "MyApp" not found in the autogenerated "UnitTests-Swift.h"

Dies ist, was ist im Inneren des oberen Teils der „Unittests-Swift.h“

typedef int swift_int3 __attribute__((__ext_vector_type__(3))); 
typedef int swift_int4 __attribute__((__ext_vector_type__(4))); 
#if defined(__has_feature) && __has_feature(modules) 
@import XCTest; 
@import ObjectiveC; 
@import MyApp; 
@import CoreData; 
#endif 

Ich reinigte das Projekt, überprüft alle relevanten Flags ("No such module" when using @testable in Xcode Unit tests, Can't use Swift classes inside Objective-C), entfernte abgeleitete Daten und so weiter .. Keine Ahnung, was passiert, aber ich bin mir ziemlich sicher, dass @import MyApp nicht dort sein sollte.

C Kann mir jemand helfen?

+0

Ich habe dieses zu Problem. – Uncommon

+0

Auf Anfrage habe ich dies in der Swift Bugs Datenbank abgelegt: https: //bugs.swift.org/browse/SR-3381 – Uncommon

+1

Kann das in Xcode 7 reproduziert werden, oder benötigt es ein obj-c-Projekt, das mit einer älteren Version erstellt wurde? Können Sie Schritte zur Reproduktion von Grund auf bereitstellen? – charmingToad

Antwort

0

Da die zu testende Swift-Klasse Teil von MyApp ist, sollten Sie "MyApp-Swift.h" anstelle von "UnitTests-Swift.h" in die Testklassen importieren.

-1

Sie können einen Swift Unit-Test (erstellen Sie einfach eine neue Unit-Datei und die Erweiterung ändern, indem .swift) hinzuzufügen.

Von dieser Einheit Testdatei Sie Ihre Swift Klassen verwenden können.

Und Sie können auch diese Datei von Ihren Objective-C Unit-Tests (und umgekehrt) mit dem Testmodul überbrück Header importieren.

Und dies würde das Standardbeispiel für Ihre Swift Unit-Test-Datei sein:

import XCTest 
@testable import MyApp 

class MyAppSwiftTests: 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. 
    // Use XCTAssert and related functions to verify your tests produce the correct results. 
    } 

    func testPerformanceExample() { 

    // This is an example of a performance test case. 
    self.measure { 
     // Put the code you want to measure the time of here. 
    } 
    } 
} 
1

ist gerade dieses Problem in meinem Projekt und nach dem ganzen Tag über die Untersuchung hat ich es endlich gelöst. Grundsätzlich passiert dies, weil Sie eine zyklische Abhängigkeit zwischen ObjC und Swift haben. Also in meinem Fall war es:

  • Swift-Protokoll mit @obj Attribut in einem Hauptziel;
  • Swift Klasse in Unittest Ziel, das dieses Protokoll geerbt;
  • Import UnitTestTarget-Swift.h in jeder Objective-C Klasse Ihres Unittest
  • Ziel

So ziemlich einfache Kombination zu diesem Fehler führt. Um dies zu beheben, Sie wollen entweder:

  • einfach sicherstellen, dass Ihre Swift Klasse in Unittest Ziel private ist, so wird es nicht bekommen zu UnitTestTarget-Swift.h

oder

  • tun Markieren Sie nicht Ihr ursprüngliches Swift-Protokoll als @objc, mit dem Sie von allen ObjecT-Testklassen auf Ihre SwiftClass zugreifen können, aber diese Klassen haben keine Ahnung vom Swift-Protokoll.