gpt4 book ai didi

json - 我如何仅模拟 Alamofire 响应?

转载 作者:搜寻专家 更新时间:2023-10-30 22:12:54 25 4
gpt4 key购买 nike

我有使用 Alamofire 的 Swift 2 代码,该代码查询它期望返回 JSON 的远程 URL。我已经完成了足够多的交互式测试,可以合理地确信它的行为足够正确。现在我想对其进行单元测试,这样我就可以依赖这段代码,然后再处理其他事情。

我是 Swift 的新手,虽然我已经为 OO Perl 编程了几十年,所以我可能错过了一些东西。

到目前为止,这是我设置检查代码的方式(不重要的事情,例如我如何删除用户名和密码以避免剃须)。调用代码指定用户名和密码,并期望在获得结果时调用两个回调之一。 (我没有深入了解如何处理错误,因此请不要在该主题上偏离主题。)

struct checkUsernameHandler {
var onSuccess: () -> ()
var onFailure: () -> ()
}
struct checkUsernameOutput {
var authenticated: Bool?
}

func checkUsername(user: User, handler: checkUsernameHandler) {
Alamofire.request(.PUT, NSURL(string: baseURL + "/user/verify?key=" + apiKey)!,
parameters: [
"username": user.username!,
"password": user.password!,
],
encoding: .JSON
).responseJSON { response in
let checkusernameOutput = self.analyseCheckUsernameResponse(response)
if let authenticated = checkusernameOutput.authenticated {
if authenticated {
handler.onSuccess()
} else {
handler.onFailure()
}
}
}
}

func analyseCheckUsernameResponse (response: Response<AnyObject, NSError>) -> checkUsernameOutput {
var output = checkUsernameOutput()
if (response.result.isSuccess) {
if let JSON = response.result.value as? NSDictionary {
// ...
}
} else {
print("Didn't get proper JSON or something: \(response.result.error)")
}
return output
}

我正在寻找的是一种获取原始 JSON 并将其以某种方式传递给 Alamofire 的方法,这样我就可以生成一个响应对象,其中包含适当的内容,包括如果它没有得到任何东西时的错误(超时? ) 或返回的数据无效(例如 HTML 格式的 404 或 500 页面)。

我现在对功能 checkUsername 很满意,所以我对任何人说“使用 OHHTTPStubs”不感兴趣。我打算只测试我不确定的代码,也就是我刚刚编写的代码。

编辑:经过更多讨论后,Alamofire 的内部组件似乎已充分连接以创建假响应,我需要完成设置网络连接所涉及的几乎所有工作无论如何。那么也许答案是“这样做太麻烦了”?

最佳答案

我成功地覆盖了 URLProtocol 的 startLoading 方法。您可以在 URLProtocolTests.swift 下的 Alamofire 测试目录中找到这样的示例。

通过拦截此调用,可以捕获传入请求,然后解析 URL 以匹配您选择的模拟响应。下面是我如何处理响应的示例:

override func startLoading() {
//Seperate module I used to handle the request
let data:NSData = mocks.find(request) as! NSData

let client = self.client
let response = HTTPURLResponse(url: (request.url)!, statusCode: 200, httpVersion: "HTTP/1.1", headerFields: cannedHeaders)

client?.urlProtocol(self, didReceive: response!, cacheStoragePolicy: URLCache.StoragePolicy.notAllowed)
cannedResponse = data
client?.urlProtocol(self, didLoad: cannedResponse as! Data)
client?.urlProtocolDidFinishLoading(self)

activeTask?.resume()
}

我在 github 上发布了如何执行此操作的完整示例: https://github.com/ksteigerwald/MockAlamofire

关于json - 我如何仅模拟 Alamofire 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35144676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com