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 级。