在 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=])")})
}