有人参考过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中使用willChangeValue
和didChangeValue
解决了我的问题。观察者现在如预期的那样被触发。
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)
}
}
}