【发布时间】:2023-04-09 02:14:01
【问题描述】:
所以我正在尝试编写一个单元测试来测试视图模型函数,但它是一个异步函数,并且在我尝试编写的测试中它将同步运行。我在网上看过一些例子,例如
listViewModel.$list.sink { _ in
XCTAssertEqual(listViewModel.list?.items.count , 1)
actionExpectation.fulfill()
}
wait(for: [actionExpectation], timeout: 1)
并尝试这里给出的解决方案Unit testing an @ObservableObject in Swift Test Driven Development
我没有任何运气尝试测试它,有什么想法吗?
视图模型
class ListViewModel: ObservableObject {
@Published var list: List?
let services: Services
init(services: Services) {
self.services = services
getList()
}
func getList() {
if let listService = self.services.resolve(ListService.self) {
ListService().getList() { [weak self] result in
switch result {
case .success(let dataRecieved):
DispatchQueue.main.async {
self?.list = dataRecieved
}
case .failure(let error):
print(error)
}
}
}
}
}
【问题讨论】:
-
您需要将您的订阅者链存储在
Set<AnyCancellable>中,否则它将在触发之前被释放。此外,您的ListService应该被嘲笑;单元测试不应具有外部依赖项,例如网络服务。 -
@Paulw11 抱歉,我对使用 swiftui/combine 进行测试有点陌生。你有没有机会举例说明应该如何使用
Set<AnyCancellable>?我的 ListService 已经被嘲笑了,我总是发回一个完成。我刚刚编辑了答案 -
@Paulw11 服务参数传递一个包含模拟列表服务的模拟服务类。它定义调用模拟服务
-
刚看了看,仍然不确定如何将其应用于
@Published var list: List?不确定您是否可以,但您可以创建一个示例答案吗?我可以在他在 repo.syncObjects() 上调用 .handleEvents 和 .sink 的示例中看到,我是否也必须重写我的服务?因为他没有展示他的同步对象函数是如何声明的