Swift:测试使用委托调用的 URLSession
Swift: Testing a URLSession called with delegates
我正在尝试对我的应用进行单元测试。
我用这个函数准备请求
func getWeatherDataAtLocation() {
let WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather"
let weatherAPI = valueForAPIKey(named:"weatherAPI")
let lat = String(locationService.latitude)
let lon = String(locationService.longitude)
do {
try networkService.networking(url: "\(WEATHER_URL)?APPID=\(weatherAPI)&lon=\(lon)&lat=\(lat)", requestType: "weather")
} catch let error {
print(error)
}
}
我有一项服务 class 网络服务正在处理网络请求:
class NetworkService {
var weatherDataDelegate: WeatherData?
var session: URLSession
init(session: URLSession = URLSession(configuration: .default)) {
self.session = session
}
func networking(url: String, requestType: String) {
var request = URLRequest(url: requestUrl)
request.httpMethod = "GET"
var task: URLSessionDataTask
task = session.dataTask(with: request) { (data, response, error) in
switch requestType {
case "weather":
do {
let weatherJSON = try JSONDecoder().decode(WeatherJSON.self, from: data)
self.weatherDataDelegate?.receiveWeatherData(weatherJSON)
} catch let jsonErr {
print(jsonErr)
}
case // Other cases
default:
print("error")
}
}
task.resume()
}
}
然后我委托 运行 这个函数来更新收到的 JSON
func receiveWeatherData(_ data: WeatherJSON) {
self.dataWeather = data
do {
try updateWeatherDataOnScreen()
} catch let error {
print(error)
}
}
问题是我不知道如何编写一些代码来测试它,我找到的所有资源都是用回调进行测试,知道吗?
所以这里面有多个步骤。
1: 为这个请求创建一个模拟版本的响应。并将其保存在 json 文件中。命名为 weather.json
2:完成后,您希望在执行请求时添加一个 #ifdef testSchemeName
。并告诉它告诉您名为 networking()
的函数从名为 "\(requestType).json"
的文件中读取而不是发出请求。
可选,更高级的方式:
This 实际上拦截了您的请求,而是将文件数据发送给您。更高级一点,但您的测试更深入 1 级。
我正在尝试对我的应用进行单元测试。
我用这个函数准备请求
func getWeatherDataAtLocation() {
let WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather"
let weatherAPI = valueForAPIKey(named:"weatherAPI")
let lat = String(locationService.latitude)
let lon = String(locationService.longitude)
do {
try networkService.networking(url: "\(WEATHER_URL)?APPID=\(weatherAPI)&lon=\(lon)&lat=\(lat)", requestType: "weather")
} catch let error {
print(error)
}
}
我有一项服务 class 网络服务正在处理网络请求:
class NetworkService {
var weatherDataDelegate: WeatherData?
var session: URLSession
init(session: URLSession = URLSession(configuration: .default)) {
self.session = session
}
func networking(url: String, requestType: String) {
var request = URLRequest(url: requestUrl)
request.httpMethod = "GET"
var task: URLSessionDataTask
task = session.dataTask(with: request) { (data, response, error) in
switch requestType {
case "weather":
do {
let weatherJSON = try JSONDecoder().decode(WeatherJSON.self, from: data)
self.weatherDataDelegate?.receiveWeatherData(weatherJSON)
} catch let jsonErr {
print(jsonErr)
}
case // Other cases
default:
print("error")
}
}
task.resume()
}
}
然后我委托 运行 这个函数来更新收到的 JSON
func receiveWeatherData(_ data: WeatherJSON) {
self.dataWeather = data
do {
try updateWeatherDataOnScreen()
} catch let error {
print(error)
}
}
问题是我不知道如何编写一些代码来测试它,我找到的所有资源都是用回调进行测试,知道吗?
所以这里面有多个步骤。
1: 为这个请求创建一个模拟版本的响应。并将其保存在 json 文件中。命名为 weather.json
2:完成后,您希望在执行请求时添加一个 #ifdef testSchemeName
。并告诉它告诉您名为 networking()
的函数从名为 "\(requestType).json"
的文件中读取而不是发出请求。
可选,更高级的方式:
This 实际上拦截了您的请求,而是将文件数据发送给您。更高级一点,但您的测试更深入 1 级。