单元测试Alamofire app中的HTTP流量

Dan*_*l D 34 unit-testing alamofire

我正在努力弄清楚如何最好地测试使用Alamofire来帮助同步服务器数据的应用程序.

我希望能够测试使用Alamofire的代码并处理来自服务器的JSON响应.我想模拟这些测试,以便我可以将预期的响应数据提供给那些测试,而不会产生真正的网络流量.

这篇博客文章(http://nshipster.com/xctestcase/)描述了在Swift中模拟对象是多么容易 - 但我不知道如何使用Alamofire及其链式响应来做到这一点.

我会嘲笑经理吗?要求?响应?任何帮助,将不胜感激!

Mat*_*oal 22

我正在添加另一个答案,因为我刚刚发现这种方法在我看来更容易阅读和使用.

我创建了一个虚拟Alamofire类,它只包含测试所需的函数和类型.现在我将此文件包含在测试目标中而不是真正的Alamofire中.

例如,我已经创建了我的Request类的版本,我根据测试定义了几个静态变量,对于这个类,我只实现了initresponseJSON函数.

public class Request {

    var request:String?
    struct response{
        static var data:NSHTTPURLResponse?
        static var json:AnyObject?
        static var error:NSError?
    }

    init (request:String){
        self.request = request
    }

    public func responseJSON(options: NSJSONReadingOptions = .AllowFragments, completionHandler: (NSURLRequest, NSHTTPURLResponse?, AnyObject?, NSError?) -> Void) -> Self {

        completionHandler(NSURLRequest(URL: NSURL(string:self.request!)!), Request.response.data, Request.response.json, Request.response.error)
        return self
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以在测试中模拟一个响应:

func testMytestFunction(){
    var HTMLResponse = NSHTTPURLResponse(URL: NSURL(string: "myurl")!, statusCode: 200, HTTPVersion: "HTTP/1.1", headerFields: nil)

    Request.response.data = HTMLResponse
    Request.response.json = LoadDataFromJSONFile("MyJsonFile")

    request(.POST, "myurl", parameters: nil, encoding: ParameterEncoding.JSON).responseJSON {
        (request, response, JSON, error) -> Void in
        // the JSON and response variable now contains exactly the data that you have passed to Request.response.data and Request.response.json
    }
}
Run Code Online (Sandbox Code Playgroud)

请求函数在此处定义:

public func request(method: Method, URLString: URLStringConvertible, parameters: [String: AnyObject]? = nil, encoding: ParameterEncoding = .URL) -> Request {

    return Request(request: URLString.URLString)
}

public func request(URLRequest: URLRequestConvertible) -> Request {

    return Request(request: "fakecall")
}
Run Code Online (Sandbox Code Playgroud)

  • 有没有想过在Github上分享这个?它可能会节省一些时间,并证明是非常有用的 (7认同)

小智 9

这个问题变老了,但我刚遇到同样的问题,使用OHHTTPStubs时解决方案非常简单.

OHHTTPStubs只是嘲笑你从NSURLSession获得的响应,所以它适用于Alamofire,你可以很好地覆盖你的代码路径.

例如,在您的测试用例中,只需使用以下方法模拟响应:

OHHTTPStubs.stubRequestsPassingTest({
  (request: NSURLRequest) -> Bool in
    return request.URL!.host == "myhost.com"
  }, withStubResponse: {
  (request: NSURLRequest) -> OHHTTPStubsResponse in
    let obj = ["status": "ok", "data": "something"]
    return OHHTTPStubsResponse(JSONObject: obj, statusCode:200, headers:nil)
})
Run Code Online (Sandbox Code Playgroud)

  • 如何将OHHTTPStubs注入单元测试.我在单元测试中使用OHHTTPStubs,但它不起作用 (4认同)