使用URLRequestConvertible

时间:2016-01-21 21:47:27

标签: ios swift unit-testing xcode7 alamofire

我有一个奇怪的问题,编写一个简单的单元测试(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)

当我从普通目标运行它时,该功能正常工作,所以问题在于测试功能,但是我不清楚我应该如何调用它,我在非测试中运行相同的代码上课并没有问题,所以我对此感到困惑。此外,错误消息有点神秘,从我用Google搜索过的情况来看,见证表有点像协议的vtable。但是我还没有弄清楚,NSMutableURLRequest的扩展是在Alamofire中实现的,我只是在使用它。

我做错了什么?我需要做些什么来解决它?

1 个答案:

答案 0 :(得分:3)

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

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