有没有一种方法可以模拟使用SwiftUI和Combine的应用程序的视图模型?我总是找到关于模拟viewmodel使用的服务的文章,但从未模拟过viewmodel本身。
我尝试为每个viewmodel创建协议。问题是:@Published包装器无法在协议中使用。似乎没有解决方案...
谢谢您的帮助。
我尝试为每个viewmodel创建协议。问题是:@Published包装器无法在协议中使用。似乎没有解决方案...
谢谢您的帮助。
@ObservableObject
或@StateObject
将不起作用。继承可能是一种解决方法(就像Jake建议的那样),或者您可以选择通用解决方案。protocol ContentViewModel: ObservableObject {
var message: String { get set }
}
final class MyViewModel: ContentViewModel {
@Published var message: String
init(_ message: String = "MyViewModel") {
self.message = message
}
}
另一方面,如果使用有限制的通用方法,你的观点可能会更加复杂。
struct ContentView<Model>: View where Model: ContentViewModel {
@ObservedObject
var viewModel: Model
var body: some View {
VStack {
Text(viewModel.message)
Button("Change message") {
viewModel.message = ""
}
}
}
}
// your mock implementation for testing
final class MockViewModel: ContentViewModel {
@Published var message: String = "Mock View Model"
}
let sut = ContentView<MockViewModel>(viewModel: MockViewModel())
protocol ViewModel {
var title: String { get set }
}
class MyViewModel: ViewModel {
@Published var title: String = "Page title"
}
class MockViewModel: ViewModel {
@Published var title: String = "MockPage title"
}
open class ViewModel {
@Published var title: String
open fun getPageTitle() {
title = "This is the page title"
}
}
class MockViewModel: ViewModel {
override fun getPageTitle() {
title = "some other page title"
}
}
Published<String>.Publisher
,但我认为沿着这条路走没有任何好处,只会增加复杂性。 - mgratzer