在 Swift 测试驱动开发中对 @ObservableObject 进行单元测试
Unit testing an @ObservableObject in Swift Test Driven Development
我正在尝试学习如何将 MVVM 架构与 TDD 结合使用,以解决无法在 SwiftUI 中对视图进行单元测试的一些问题。
我有一个带有日期的 Alarm 结构:
import Foundation
struct Alarm {
var time: Date
}
而且我有基本的
class AlarmPickerViewModel: ObservableObject {
@Published var alarm: Alarm
init(alarm: Alarm) {
self.alarm = alarm
}
}
如果 AlarmPickerViewModel
不是 ObservableObject
的子类并且警报 属性 不是 @Published
.
我看过 ,但似乎对我没有帮助。
请指出我哪里出错了?
如果 alarm
不是 @Published
,您可以创建一个甚至无法编译的测试,方法是简单地创建对该 属性 的订阅,因为您将只能订阅如果它是 @Published
.
ObservableObject
一致性向您的对象添加了 objectWillChange
Publisher
,因此要测试它,您只需订阅该 Publisher
。如果 AlarmPickerViewModel
不是 ObservableObject
,测试甚至不会编译。
func testAlarmPickerViewModel() {
let alarmPickerViewModel = AlarmPickerViewModel(alarm: Alarm(time: .distantFuture))
alarmPickerViewModel.$alarm.sink(receiveValue: { print("ViewModel.alarm updated, new value: \([=10=])") })
alarmPickerViewModel.objectWillChange.sink(receiveValue: { print("ViewModel updated: \([=10=])")})
}
我正在尝试学习如何将 MVVM 架构与 TDD 结合使用,以解决无法在 SwiftUI 中对视图进行单元测试的一些问题。
我有一个带有日期的 Alarm 结构:
import Foundation
struct Alarm {
var time: Date
}
而且我有基本的
class AlarmPickerViewModel: ObservableObject {
@Published var alarm: Alarm
init(alarm: Alarm) {
self.alarm = alarm
}
}
如果 AlarmPickerViewModel
不是 ObservableObject
的子类并且警报 属性 不是 @Published
.
我看过
请指出我哪里出错了?
如果 alarm
不是 @Published
,您可以创建一个甚至无法编译的测试,方法是简单地创建对该 属性 的订阅,因为您将只能订阅如果它是 @Published
.
ObservableObject
一致性向您的对象添加了 objectWillChange
Publisher
,因此要测试它,您只需订阅该 Publisher
。如果 AlarmPickerViewModel
不是 ObservableObject
,测试甚至不会编译。
func testAlarmPickerViewModel() {
let alarmPickerViewModel = AlarmPickerViewModel(alarm: Alarm(time: .distantFuture))
alarmPickerViewModel.$alarm.sink(receiveValue: { print("ViewModel.alarm updated, new value: \([=10=])") })
alarmPickerViewModel.objectWillChange.sink(receiveValue: { print("ViewModel updated: \([=10=])")})
}