如何快速测试缓存响应?

问题描述

我正在尝试为我的 URLSession 快速缓存编写单元测试。

有没有办法知道响应是来自服务器还是来自缓存,以便我可以编写单元测试来检查我的响应是否被缓存?

解决方法

您需要继承 URLCache 以创建一个 mock 并配置您的 URLSession 以便它使用您的 MockURLCache。

您的 MockURLCache 覆盖:

override func getCachedResponse(for dataTask: URLSessionDataTask,completionHandler: @escaping (CachedURLResponse?) -> Void) {
    super.getCachedResponse(for: dataTask) { cachedURLResponse in
        self.retrievedCachedResponse?(cachedURLResponse) 
        completionHandler(cachedURLResponse)
    }
}

其中 self.retrievedCachedResponse(_:) 是闭包类型的可选:

class MockURLCache: URLCache {
    var retrievedCachedResponse: ((CachedURLResponse?) -> Void)?
    ...
}

您可以在单元测试中方便地设置。这个闭包可能会满足你可以断言的 XCTestExpectation。