Dan*_*l D 34 unit-testing alamofire
我正在努力弄清楚如何最好地测试使用Alamofire来帮助同步服务器数据的应用程序.
我希望能够测试使用Alamofire的代码并处理来自服务器的JSON响应.我想模拟这些测试,以便我可以将预期的响应数据提供给那些测试,而不会产生真正的网络流量.
这篇博客文章(http://nshipster.com/xctestcase/)描述了在Swift中模拟对象是多么容易 - 但我不知道如何使用Alamofire及其链式响应来做到这一点.
我会嘲笑经理吗?要求?响应?任何帮助,将不胜感激!
Mat*_*oal 22
我正在添加另一个答案,因为我刚刚发现这种方法在我看来更容易阅读和使用.
我创建了一个虚拟Alamofire类,它只包含测试所需的函数和类型.现在我将此文件包含在测试目标中而不是真正的Alamofire中.
例如,我已经创建了我的Request类的版本,我根据测试定义了几个静态变量,对于这个类,我只实现了init和responseJSON函数.
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)
小智 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)
| 归档时间: |
|
| 查看次数: |
14730 次 |
| 最近记录: |