ios - +[AVURLAsset isPlayableExtendedMIMEType :] behaves differently when unit tested

标签 ios unit-testing avfoundation

在我的应用中调用 [AVURLAsset isPlayableExtendedMIMEType:@"video/mp4; codecs=\"avc1.64001F, mp4a.40.2\""] 返回 YES,这预计。

如果我在单元测试中运行完全相同的代码,那么它返回 NO

应用程序和单元测试都在运行 iOS 7.0 的 iPhone Retina(4 英寸)模拟器上使用 Xcode 5.0.2 运行。

- (void) testPlayableExtendedMIMEType
{
    XCTAssertTrue([AVURLAsset class], @"");
    XCTAssertTrue([AVURLAsset isPlayableExtendedMIMEType:@"video/mp4; codecs=\"avc1.64001F, mp4a.40.2\""], @"");
}

第一个断言通过,但第二个断言失败。

为什么这种行为在单元测试和应用中会有所不同?

最佳答案

通过逆向工程+[AVURLAsset isPlayableExtendedMIMEType:]是如何实现的,我找到了问题的原因。

这是它正在做的事情的堆栈跟踪:

frame #0: 0x01b2861e CoreMedia`CelestialGetModelSpecificName
frame #1: 0x01b2885a CoreMedia`CelestialCFCreatePropertyListFromBundleIdentifier + 11
frame #2: 0x00050039 AVFoundation`__33+[AVURLAsset _avfValidationPlist]_block_invoke_0 + 39
frame #3: 0x02e99014 libdispatch.dylib`_dispatch_client_callout + 14
frame #4: 0x02e8b09f libdispatch.dylib`dispatch_once_f + 57
frame #5: 0x02e8b061 libdispatch.dylib`dispatch_once + 31
frame #6: 0x00050006 AVFoundation`+[AVURLAsset _avfValidationPlist] + 49
frame #7: 0x00050664 AVFoundation`+[AVURLAsset isPlayableExtendedMIMEType:] + 64

CelestialCFCreatePropertyListFromBundleIdentifier 函数尝试读取 MediaToolbox 框架内的 MediaValidator.plist 文件。 plist 文件的位置取决于设备型号名称。以下是 iOS 7 模拟器的不同 MediaValidator.plist 文件。

MediaToolbox.framework
|-- J1
|   `-- MediaValidator.plist
|-- K93
|   `-- MediaValidator.plist
|-- N41
|   `-- MediaValidator.plist
`-- N94
    `-- MediaValidator.plist

运行应用程序时,CelestialGetModelSpecificName 函数返回 N41i.e. iPhone 5 .
运行单元测试时,CelestialGetModelSpecificName 函数返回 N88,即 iPhone 3GS。如您所见,MediaToolbox 框架内没有 N88 目录,这就是 +[AVURLAsset isPlayableExtendedMIMEType:] 最终失败的原因。

仔细查看 CelestialGetModelSpecificName 函数可以找到解决方案。模拟器读取 IPHONE_SIMULATOR_CLASS 环境变量以了解正在模拟的设备。如果未设置 IPHONE_SIMULATOR_CLASS 环境变量,则默认为硬编码的 N88 值。

因此,为了让测试通过,我们只需手动将 IPHONE_SIMULATOR_CLASS 环境变量设置为 N41,因为单元测试运行器不会自动设置它。

setenv("IPHONE_SIMULATOR_CLASS", "N41", 0);

关于ios - +[AVURLAsset isPlayableExtendedMIMEType :] behaves differently when unit tested,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21069515/

相关文章:

ios - 如何将视觉框架坐标系转化为ARKit?

iOS-如何使用 AVAsset 或 AVURLAsset 获取 .mp4 文件的持续时间

ios - 如何在选择自定义 UITableViewCell 时获取触摸坐标?

iphone - 如何删除 iCarousel 中的重复项目

ios - 使用自动布局使 UIView 和内容扩展以填充 UIToolbar 中的可用水平空间

python - 模拟 itertools.zip_longest

iphone - AVFoundation 相机预览屏幕给出错误的缩放

ios - 快速命名空间

reactjs - 开 Jest : ReferenceError: KeyframeEffect is not defined

java - 如何为mockito设置模拟对象方法调用的回调?