使用 URLRequestConvertible 在单元测试中链接错误
Linking error in unit test using URLRequestConvertible
我在为一个非常简单的函数编写一个简单的单元测试 (Xcode 7.2) 时遇到一个奇怪的问题,该函数确保将参数添加到 URL:
func appendToken(token: String, toRequest request: URLRequestConvertible) throws -> URLRequestConvertible {
var error: NSError?
let modifiedRequest: NSMutableURLRequest
(modifiedRequest, error) = Alamofire.ParameterEncoding.URL.encode(request, parameters: ["token": self.token])
guard error == nil else {
// TODO: handle error
throw error!
}
return modifiedRequest
}
单元测试是这样的:
func testTokenAddition() {
let token = "ABCD12345"
let client = MyClass(token: token)
let originalRequest = NSURLRequest(URL: NSURL(string:"http://localhost")!)
do {
let modifiedRequest = try client.appendToken(token, toRequest: originalRequest).URLRequest
XCTAssertTrue(modifiedRequest.URLRequest.URLString.hasSuffix("token=\(token)"))
} catch {
XCTFail()
print(error)
}
}
显然这是一个非常简单的测试,我想以此为基础进行构建(所以请不要关注实际的断言)。但是当我尝试 运行 测试时,我得到了这个链接错误:
Undefined symbols for architecture x86_64:
"protocol witness table for __ObjC.NSURLRequest : Alamofire.URLRequestConvertible in Alamofire", referenced from:
SDKitTests.SDKitTests.testTokenAddition (SDKitTests.SDKitTests)() -> () in SDKitTests.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
当我从普通目标 运行 函数工作时,所以问题出在测试函数中,但我不清楚我应该如何调用它,我 运行同样的代码在非测试 class 中没有问题,所以我对此有点困惑。此外,错误消息有点神秘,根据我在 Google 上搜索到的信息,witness table 有点像协议的 vtable。但我没有搞砸,NSMutableURLRequest
的扩展是在 Alamofire 中实现的,我只是在使用它。
我做错了什么?我需要做什么来修复它?
确保 Alamofire 库与您的测试目标链接。
您可能还需要从测试目标中删除 inherit! :search_paths
。
我在为一个非常简单的函数编写一个简单的单元测试 (Xcode 7.2) 时遇到一个奇怪的问题,该函数确保将参数添加到 URL:
func appendToken(token: String, toRequest request: URLRequestConvertible) throws -> URLRequestConvertible {
var error: NSError?
let modifiedRequest: NSMutableURLRequest
(modifiedRequest, error) = Alamofire.ParameterEncoding.URL.encode(request, parameters: ["token": self.token])
guard error == nil else {
// TODO: handle error
throw error!
}
return modifiedRequest
}
单元测试是这样的:
func testTokenAddition() {
let token = "ABCD12345"
let client = MyClass(token: token)
let originalRequest = NSURLRequest(URL: NSURL(string:"http://localhost")!)
do {
let modifiedRequest = try client.appendToken(token, toRequest: originalRequest).URLRequest
XCTAssertTrue(modifiedRequest.URLRequest.URLString.hasSuffix("token=\(token)"))
} catch {
XCTFail()
print(error)
}
}
显然这是一个非常简单的测试,我想以此为基础进行构建(所以请不要关注实际的断言)。但是当我尝试 运行 测试时,我得到了这个链接错误:
Undefined symbols for architecture x86_64:
"protocol witness table for __ObjC.NSURLRequest : Alamofire.URLRequestConvertible in Alamofire", referenced from:
SDKitTests.SDKitTests.testTokenAddition (SDKitTests.SDKitTests)() -> () in SDKitTests.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
当我从普通目标 运行 函数工作时,所以问题出在测试函数中,但我不清楚我应该如何调用它,我 运行同样的代码在非测试 class 中没有问题,所以我对此有点困惑。此外,错误消息有点神秘,根据我在 Google 上搜索到的信息,witness table 有点像协议的 vtable。但我没有搞砸,NSMutableURLRequest
的扩展是在 Alamofire 中实现的,我只是在使用它。
我做错了什么?我需要做什么来修复它?
确保 Alamofire 库与您的测试目标链接。
您可能还需要从测试目标中删除 inherit! :search_paths
。