有没有办法让 @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)
}
我有以下 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)
}