使用 URLRequestConvertible 的单元测试中的链接错误

Posted

技术标签:

【中文标题】使用 URLRequestConvertible 的单元测试中的链接错误【英文标题】:Linking error in unit test using URLRequestConvertible 【发布时间】:2016-01-21 21:47:26 【问题描述】:

我在为一个非常简单的函数编写一个简单的单元测试(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)

当我从普通目标运行该函数时,该函数有效,因此问题出在测试函数中,但我不清楚应该如何调用它,我在非测试类中运行相同的代码并且没有问题,所以我对此有点困惑。此外,错误消息有点神秘,根据我的谷歌搜索,见证表有点像协议的 vtable。但我没有搞砸,NSMutableURLRequest 的扩展是在 Alamofire 中实现的,我只是在使用它。

我做错了什么?我需要做什么来修复它?

【问题讨论】:

Alamofire 库是否与您的测试目标相关联? 噢!好决定。当我添加 Alamofire Pod 时,我以为 Cocoa Pods 会解决这个问题,但显然没有。链接到它确实有效。请作为答案发布,以便我接受。 【参考方案1】:

确保 Alamofire 库与您的测试目标链接。

您可能还需要从测试目标中删除 inherit! :search_paths

【讨论】:

如何将 Alamofire 与您的测试目标联系起来?我找不到有关此的任何信息。 你在使用 Cocoapods 吗?将pod Alamofire 添加到您的测试目标中,就像您的主应用程序目标一样。 啊,就是这样。我在某处读过,将inherit! :search_paths 放在 pod 文件的测试模块部分中,会将链接到应用程序的任何框架链接到测试模块。我猜他们错了。我注释掉了inherit! :search_paths 并用pod 'Alamofire 替换它谢谢

以上是关于使用 URLRequestConvertible 的单元测试中的链接错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 URLRequestConvertible 的单元测试中的链接错误

如何减少 responseJSON 中的样板,就像我使用 URLRequestConvertible 对相关的 Web 调用进行分组一样

类型不符合 Alamofire 的协议“URLRequestConvertible”

Swift 3 - 创建简单请求方法 POST (URLRequestConvertible) 的问题

从 URLRequestConvertible 扩展时设置多部分请求的最佳方法是啥

无法将“NSMutableURLRequest”(0x11beb7040)类型的值转换为“Alamofire.URLRequestConvertible”(0x11beb9040)