gpt4 book ai didi

ios - 如何用 `downloadTask` 为 `completionHandler ` 编写单元测试?

转载 作者:可可西里 更新时间:2023-11-01 00:56:19 25 4
gpt4 key购买 nike

这是我的下载函数:

// Download a file from the url to the local directory
class func downloadUrl(url: URL, to dirUrl: URL, completion: (() -> ())?){
let sessionConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfig)
let request = URLRequest(url: url)

let task = session.downloadTask(with: request) {(tempLocalUrl, response, error) in
if let tempLocalUrl = tempLocalUrl, error == nil {
// Success, copy the downloaded file from the memory to the disk
print("Finished downloading!")
do {
try FileManager.default.copyItem(at: tempLocalUrl,to:
dirUrl.appendingPathComponent((response?.suggestedFilename)!))
if completion != nil {
completion!()
}
} catch (let writeError) {
print("Fliled to write file \(dirUrl) : \(writeError)")
}
} else {
print("Failure: \(String(describing: error?.localizedDescription))")
}
}
task.resume()
}

我想写一个单元测试方法来测试它是否从url下载文件到dirUrl

func testDownloadUrl(){
let fm = FileManager.default
let url = URL(string: "https://raw.githubusercontent.com/apple/swift/master/README.md")
fileDownloader.downloadUrl(url: url!, to: fm.temporaryDirectory, completion: nil)

// Check the contents of temp file
let tempContents = try? fm.contentsOfDirectory(atPath: fm.temporaryDirectory.path)
print("Contents: \(tempContents)")
}

但是没有输出“Finished downloading!”或“失败...”,即使我通过了单元测试,所以我猜在这个测试用例中没有调用 completionHandler。

我的问题是如何让单元测试方法等到下载任务完成?

最佳答案

标准习语是使用Xcode asynchronous testing APIs , 主要是 XCTestExpectation类(class)。这些从 Xcode 6 开始可用,因此,如果您使用的是最新版本,您应该被覆盖 ;)

通用的异步测试模板如下:

func testAsyncFunction() {
let asyncDone = expectation(description: "Async function")
...
someAsyncFunction(...) {
...
asyncDone.fulfill()
}
wait(for: [asyncDone], timeout: 10)
/* Test the results here */
}

这将阻止您的测试执行,直到上述功能完成(指定的超时已过)。

关于ios - 如何用 `downloadTask` 为 `completionHandler ` 编写单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47126023/

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