有没有办法让 @Published 属性 知道它实际上正在更新和发布?

Is there a way to a @Published property that it's actually getting updated and publishing?

我有以下 class,我想测试如果订阅 "elapsedTime" 的对象发布 属性,它会在 属性 更改时接收更新。

class SampleSegmentTimer {
    @Published var elapsedTime: DateComponents?
    private var subs = Set<AnyCancellable>()

    func start(tickingEvery interval: TimeInterval = 1) {
        Timer.publish(every: interval, on: .main, in: .common)
            .autoconnect()
            .map(transform)
            .assign(to: \.elapsedTime, on: self)
            .store(in: &subs)
    }

    private func transform(_ date: Date) -> DateComponents {
        // do some calculation
        DateComponents()
    }
}

我想编写如下测试:

func testStart() {
        // Given
        let segmentTimer = SampleSegmentTimer()
        var elapsedTimes = [DateComponents?]()
        let elapsedTimeSub = segmentTimer.$elapsedTime.sink { elapsedTimes.append([=12=]) }

        // When
        segmentTimer.start(tickEvery: 1) // I want to wait 3 seconds to let it tick 3 times

        // Then
        XCTAssertEqual(elapsedTimes.count, 3)
}
func testStart() {
        // Add expectation
        let expectation = XCTestExpectation(description: "tick")
        // Given
        let segmentTimer = SampleSegmentTimer()
        var elapsedTimes = [DateComponents?]()
        let elapsedTimeSub = segmentTimer.$elapsedTime.sink { elapsedTimes.append([=10=]) }

        // When
        segmentTimer.start(tickEvery: 1) // I want to wait 3 seconds to let it tick 3 times

        // Add this line
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) { expectation.fulfill() }

        // Then
        wait(for: [expectation], timeout: 5) // wait for the fulfillment signal
        XCTAssertEqual(elapsedTimes.count, 3)
}