在Swift测试驱动开发中对@ObservableObject进行单元测试。

问题描述 投票:0回答:1

我正试图学习如何使用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.

我看了 这个问题在网站上 但似乎对我没有帮助。

请大家指点一下我哪里做错了?

swift mvvm tdd observableobject
1个回答
1
投票

你可以创建一个甚至不会编译的测试,如果 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)")})
}
© www.soinside.com 2019 - 2024. All rights reserved.