swift - 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
表现不一样。
解决方案
在我的模拟中使用willChangeValue
anddidChangeValue
解决了我的问题。观察者现在按预期触发。
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)
}
}
}
推荐阅读
- python - 将 Apache Beam 多文件作业部署到 Dataflow,包括 protobufs
- kubernetes - 将 yaml 数组作为 env 添加到 kubernetes/kustomize
- json - 如何在从 json 解码的 swift 字典中拥有一个字符串和一个 int
- apache-spark - 使用 Spark 编写 Parquet 文件,如何为单个列启用字典
- apache-spark - 尝试在 groupBy 之后映射值时不能使用 null 作为映射键
- excel - 将各种 Range.Values 汇总为 Int
- ruby-on-rails - 错误的参数零个或一个错误在rails
- java - 针对不同的依赖集构建相同代码的推荐方法是什么?
- node.js - 来自后端的 req.query 在部署到 Heroku 后原来是 React 前端的 json,如何解决?
- c# - ResolutionContext.Items 从 Automapper 9.0 抛出异常