我的unittest目标构建失败,出现以下错误:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_MCStore", referenced from:
objc-class-ref in MCStoreTests.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
基本信息:
我检查了什么:
Symbols Hidden by Default
是不Other Linker Flags
是-framework XCTestFramework Search Paths
是$(SDKROOT)/ Developer / Library / Frameworks $(继承)根据这个link,我需要在单位测试目标Bundle Loader
中设置低于内容的Build Settings
$(BUILT_PRODUCTS_DIR)/MyExistingApp.app/MyExistingApp
以下是我在尝试在Xcode 9中添加单元测试目标时执行以解决问题的步骤:
至少从Xcode 7.3测试目标开始,您可以选择“主机应用程序”。在测试目标(但目前不是UI测试目标)中,这会自动填充“测试主机”构建设置,但不会填充“捆绑加载器”,这可能导致找不到类。
考虑到这一点,如果将测试目标的“Bundle Loader”构建设置设置为$(TEST_HOST)
,即使您更改了Host Application,它也将始终包含正确的值。
这实际上与@ yuwen-yan发布的链接中给出的建议相反,应该相当于减少工作量。
经历过同样的问题。为我修复的是在测试目标enable modules (c and objective-c)
中将Build Settings
设置为YES。
此错误可能是测试目标类型错误的结果,即ui测试目标。
UI测试目标不能使用主要目标的内部,甚至不能使用@testable
导入。单元测试目标OTOH可以使用内部。
See more details in this answer.
(我相信这在一些XCode版本中已经发生了变化,导致混淆。典型的方法就是在ui测试目标中包含来自原始目标的大量文件。正确的方法是设计UI测试,使他们不要不需要或使用来自主要目标的大量代码。)
所以这对我有用...
override func setUp() {
super.setUp()
let promise = expectation(description: "App has finished running")
DispatchQueue.global(qos: .background).async{
// Wait on the background thread
sleep(4)
DispatchQueue.main.async {
// Fullfill the promise in the main thread
promise.fulfill()
}
}
// Initialize the storyboard
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// Get the view controller
sut = storyboard.instantiateViewController(withIdentifier: String(describing: ViewController.self)) as? ViewController
_ = sut.view
waitForExpectations(timeout: 5) { (_) in
// Finish set up after the app is done running its code
}
}// End setUp() Method
对我有用的只是在podfile上使用测试目标。
target 'MyAppName' do
use_frameworks!
pod 'SwiftLint'
pod 'RxSwift'
pod 'RxCocoa'
pod 'RxDataSources'
pod 'RxGRDB'
target 'UnitTestTarget' do
inherit! :search_paths
end
end
将测试目标添加到创建2或3个Xcode版本之前的旧项目后遇到相同的链接器错误。此外,项目有各种xcodeproject / target / bundle名称。所有可能的重命名,清洁,Build settings
,Build phases
,Scheme
操作对我没有用。
经过长时间的努力,实际工作的是在最新的Xcode版本中从头开始重新创建项目以及所有目标。它终于链接了!在这种情况下,你甚至不需要手动修改Search paths
,Bundle loader
,Xcode会为你做。
在我的情况下,当我需要测试存在于我的app中的框架中的类时,我遇到了这个错误:
测试框架类。 1.将测试目标添加到macOS。 2.选择项目/目标窗口。选择测试目标。 3.转到“构建阶段”,“将二进制文件链接到库”,添加要测试的框架。 4.在测试类(setup / teardown)中,将“import”添加到要从该框架测试的类中