Есть ли способ получить свойство @Published, которое будет обновляться и публиковаться? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть следующий класс, я хочу проверить, что если объект подписан на опубликованное свойство "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($0) }

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

        // Then
        XCTAssertEqual(elapsedTimes.count, 3)
}

1 Ответ

0 голосов
/ 30 марта 2020
func testStart() {
        // Add expectation
        let expectation = XCTestExpectation(description: "tick")
        // Given
        let segmentTimer = SampleSegmentTimer()
        var elapsedTimes = [DateComponents?]()
        let elapsedTimeSub = segmentTimer.$elapsedTime.sink { elapsedTimes.append($0) }

        // 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)
}
...