我有一些Objective-C [i-os]代码,我想使用XCode运行单元测试。它使用以下命令访问不同的元数据,具体取决于设备类型:
[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad
我遇到的问题是,当我运行单元测试时,此结果始终为真。理想情况下,能够将其设置为测试运行会很棒。
我认为可以做到的方法是创建一个封装设备检查的类并模拟测试。但我认为,如果有更好的解决方案,可能值得一试。
供参考,nice blog post with many links,Apple Unit testing guide和Unit test sample code project。
答案 0 :(得分:4)
今天早上我尝试了几种不同的方法:
使用仅与我的测试目标相关联的UIDevice
类别。在该类别中,我将使用currentDevice
实现(partialMock
)覆盖OCMock
并存根必要的方法,以便强制返回Pad或Phone到我的特定测试。它应该有效,但很难弄清UIDevice
或UIApplication
这样的类,模拟器经常会崩溃,这是一个不好的迹象。
#undef UI_INTERFACE_IDIOM()
上 #define
和.pch
。将测试中的UI_INTERFACE_IDIOM()
实现指向我自己的单例实例,我可以相应地设置为Pad或Phone。这是有效的,但主要的问题是,当你运行测试时,模拟器也会上升(应用程序测试),所以如果你在iPad上运行测试,你的测试将会通过,但模拟器的其他部分将会失败,因为它来自UI_INTERFACE_IDIOM()
的矛盾反应(其中一个是如果你在通用应用程序环境中加载nib特定的iPhone)
我认为这是最好的方法。作为计算机科学中的一切,只需将另一层放入=)而不是使用UI_INTERFACE_IDIOM()
来评估它是否在Pad或Phone设备上的代码,而是将此逻辑封装在您可以在测试期间模拟的对象中。那样UI_INTERFACE_IDIOM()
仍可用于模拟器的其余部分。您的生产代码实际上将依赖它,但您的测试将依赖于可以在测试中按预期响应的存根实现。
如果您愿意,我可以就此事分享一些代码。是的,这是一个疲惫的人!
您是如何设法解决此问题的?