我正试图学习如何使用MVVM架构与TDD来解决SwiftUI中无法单元测试View的一些问题。
我有一个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: \($0)") })
alarmPickerViewModel.objectWillChange.sink(receiveValue: { print("ViewModel updated: \($0)")})
}