【发布时间】:2020-03-01 21:13:09
【问题描述】:
我有一个创建和返回 Observable 的函数,它使用 URLSession 下载和解码数据。我想为此功能编写单元测试,但不知道如何解决。
功能:
func getRecipes(query: String, _ needsMoreData: Bool) -> Observable<[Recipes]> {
guard let url = URL(string: "https://api.spoonacular.com/recipes/search?\(query)&apiKey=myApiKey") else {
return Observable.just([])
}
return Observable.create { observer in
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {
return
}
do {
if self.recipes == nil {
self.recipes = try self.decoder.decode(Recipes.self, from: data)
self.dataList = self.recipes.results
self.baseUrl = self.recipes.baseUrl
} else {
if needsMoreData {
self.recipes = try self.decoder.decode(Recipes.self, from: data)
self.dataList.append(contentsOf: self.recipes.results.suffix(50))
} else {
self.dataList = try self.decoder.decode(Recipes.self, from: data).results
}
}
observer.onCompleted()
} catch let error {
observer.onError(error)
}
}
task.resume()
return Disposables.create {
task.cancel()
}
}
.trackActivity(activityIndicator)
}
【问题讨论】:
-
嗯,你想测试什么?测试URLSession和
dataTask没有意义;你知道那些做什么,并且在测试期间上网通常是没有意义的(除非你的目标是测试你的 api 仍在运行并且没有改变它的输出)。所以你想mock URLSession 接口。我不知道 Observable,但我知道如何模拟 URLSession 行为;您创建一个 URLProtocol 子类。现在请求通过您的代码,您可以将任何您想要的内容返回到数据任务的完成处理程序中。
标签: swift unit-testing rx-swift urlsession