AVPlayerItem状态观测器-单元测试状态更改



有人参考过swift中的单元测试键值观察逻辑吗?我想在单元测试中模拟AVPlayerItem的状态变化,以确认触发了预期的逻辑。为了简单起见,这就是我目前所拥有的:

观察所提供的playerItem的状态的函数

public func observePlayerItemStatus(playerItemToObserve: AVPlayerItem) -> NSKeyValueObservation {
let observerToken = playerItemToObserve.observe(.status, options: [.new, .old], changeHandler: { (playerItemToObserve, _) in
switch playerItemToObserve.status {
case .failed:
// failed logic
case .readyToPlay:
// ready to play logic
default:
// default logic
}
})
return observerToken
}

我创建了一个模拟类,MockAVPlayerItem

class MockAVPlayerItem: AVPlayerItem {
var mockStatus: AVPlayerItem.Status = .unknown
public override var status: AVPlayerItem.Status {
get { return mockStatus }
set { self.mockStatus = newValue }
}
}

我的单元测试试图触发状态代码更改,会执行以下操作:

func test_readyToPlayIsTriggered() {
let url = URL(string: "https://www.rmp-streaming.com/media/big-buck-bunny-360p.mp4")!
let mockPlayerItem = MockPlayerItem(url: url)
let statusToken = observePlayerItemStatus(playerItemToObserve: mockPlayerItem)
mockPlayerItem.status = .readyToPlay
... some assertion that ready to play was called ....
}

当我运行应用程序时,逻辑本身是有效的,但是我的单元测试无法触发我的观察者。我采用了类似的方法来模拟AVPlayer.timeControlStatus,效果很好,但由于某种原因,AVPlayerItem.status的行为不一样。

在mock中使用willChangeValuedidChangeValue解决了我的问题。观察者现在如预期的那样被触发。

class MockAVPlayerItem: AVPlayerItem {
var mockStatus: AVPlayerItem.Status = .unknown
public override var status: AVPlayerItem.Status {
get { return mockStatus }
set {
willChangeValue(for: .status)
self.mockStatus = newValue
didChangeValue(for: .status)
}
}
}

最新更新