如何模拟 URLSession.DataTaskPublisher

Tim*_*Tim 5 mocking ios swift urlsession combine

我该如何嘲笑URLSession.DataTaskPublisher?我有一堂课Proxy需要注入URLSessionProtocol

protocol URLSessionProtocol {
    func loadData(from url: URL) -> URLSession.DataTaskPublisher
}
Run Code Online (Sandbox Code Playgroud)
class Proxy {

    private let urlSession: URLSessionProtocol

    init(urlSession: URLSessionProtocol) {
        self.urlSession = urlSession
    }

    func get(url: URL) -> AnyPublisher<Data, ProxyError> {
        // Using urlSession.loadData(from: url)
    }

}

Run Code Online (Sandbox Code Playgroud)

URLSession该代码最初与完成处理程序的传统版本一起使用。它非常完美,因为我可以轻松地模拟URLSession测试,就像 Sundell 的解决方案:Mocking in Swift

是否可以使用组合框架做同样的事情?

Gil*_*man 4

就像您可以注入 aURLSessionProtocol来模拟具体会话一样,您也可以注入模拟的Publisher. 例如:

let mockPublisher = Just(MockData()).eraseToAnyPublisher()
Run Code Online (Sandbox Code Playgroud)

但是,根据您对此发布者的操作,您可能需要解决组合异步发布者的一些奇怪问题,请参阅此文章以获取更多讨论:

为什么Combine 的 receive(on:) 运算符会吞下错误?