我试图在我的遗留Objc代码中测试一些Swift类(@objc类)。我在我的测试类中导入“UnitTests-Swift.h”。
然后我收到此错误:
在自动生成的“UnitTests-Swift.h”中找不到模块“MyApp”
这是“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
我清理了项目,检查了所有相关标志("No such module" when using @testable in Xcode Unit tests,Can't use Swift classes inside Objective-C),删除了派生数据等等。不知道发生了什么,但我很确定@import MyApp不应该在那里..
任何人都可以帮我吗?
答案 0 :(得分:3)
刚刚在我的项目中遇到了这个问题,经过一整天的调查后我终于解决了这个问题。 基本上这是因为你在ObjC和Swift之间存在循环依赖。所以在我的情况下它是:
@obj
属性的Swift协议; UnitTestTarget-Swift.h
如此简单的组合会导致此错误。为了解决这个问题,您需要:
private
,因此它无法访问UnitTestTarget-Swift.h
或
@objc
,这将允许您从所有ObjectiveC测试类访问您的SwiftClass,但这些类不会对Swift协议有任何了解。答案 1 :(得分:0)
因为要测试的Swift类是MyApp的一部分,所以你应该导入" MyApp-Swift.h"在测试类而不是" UnitTests-Swift.h"。
答案 2 :(得分:0)
您可以添加Swift单元测试(只需创建一个新的单元文件并按.swift
更改扩展名。)。
从该单元测试文件中,您可以使用Swift类。
您还可以使用测试模块桥接标头从Objective-C单元测试(以及相反的方式)导入该文件。
这将是Swift单元测试文件的默认示例:
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.
}
}
}
答案 3 :(得分:0)
此解决方案对我有帮助:
HEADER_SEARCH_PATHS
$CONFIGURATION_TEMP_DIR/myProjectName.build/DerivedSources
希望有帮助!
非常感谢article。