【发布时间】:2021-11-16 04:09:43
【问题描述】:
我正在开发一个 iOS 应用程序(使用 Swift、XCTest 和 Combine),试图在我的视图模型中测试一个函数,该函数在发布者上调用和设置 sink。我想测试视图模型,不是发布者本身。我真的不想使用DispatchQueue.asyncAfter(,因为理论上我不知道发布者需要多长时间才能回复。例如,我将如何测试 XCTAssertFalse(viewModel.isLoading)
class ViewModel: ObservableObject {
@Published var isLoading: Bool = false
@Published var didError: Bool = false
var dataService: DataServiceProtocol
init(dataService: DataServiceProtocol) {
self.dataService = dataService
}
func getSomeData() { // <=== This is what I'm hoping to test
isLoading = true
dataService.getSomeData() //<=== This is the Publisher
.sink { (completion) in
switch completion {
case .failure(_):
DispatchQueue.main.async {
self.didError = true
}
case .finished:
print("finished")
}
DispatchQueue.main.async {
self.isLoading = false
}
} receiveValue: { (data) in
print("Ok here is the data", data)
}
}
}
我想编写一个如下所示的测试:
func testGetSomeDataDidLoad() {
// this will test whether or not getSomeData
// loaded properly
let mockDataService: DataServiceProtocol = MockDataService
let viewModel = ViewModel(dataService: mockDataService)
viewModel.getSomeData()
// ===== THIS IS THE PROBLEM...how do we know to wait for getSomeData? ======
// It isn't a publisher...so we can't listen to it per se... is there a better way to solve this?
XCTAssertFalse(viewModel.isLoading)
XCTAssertFalse(viewModel.didError)
}
真的希望重构我们当前的测试,这样我们就不会使用DispatchQueue.asyncAfter(
【问题讨论】:
标签: ios swift testing xctest combine