[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad
我遇到的问题是,当我运行单元测试时,此结果始终为真.理想情况下,能够将其设置为测试运行会很棒.
我猜它可以做的方法是创建一个封装设备检查的类并模拟测试.但我认为,如果有更好的解决方案,可能值得一看.
供参考,nice blog post with many links,Apple Unit testing guide和Unit test sample code project.
解决方法
>使用仅链接到我的测试目标的UIDevice类别.在该类别中,我将使用partialMock实现(OCMock)覆盖currentDevice并存根必要的方法,以便它强制返回Pad或Phone到我的特定测试.它应该有工作,但很难弄乱像UIDevice或UIApplication这样的类,模拟器经常崩溃,这是一个不好的迹象.
> #undef UI_INTERFACE_IdioM()和#define在我的测试.pch上.将测试中的UI_INTERFACE_IdioM()实现指向我自己的单例实例,我可以相应地设置为Pad或Phone.这是有效的,但主要的问题是,当你运行测试时,模拟器也会上升(应用程序测试),所以如果你在iPad上运行测试,你的测试将会通过,但模拟器的其他部分将会失败,因为它从UI_INTERFACE_IdioM()得到的矛盾响应(其中一个是如果你在通用应用程序环境中加载特定于iPhone的nib)
>我认为这是最好的方法.作为计算机科学中的所有内容,只需在=)中添加另一层代替使用UI_INTERFACE_IdioM()的代码来评估它是否在Pad或Phone设备上,将此逻辑封装在您可以在测试期间模拟的对象中.这样,UI_INTERFACE_IdioM()仍然可用于模拟器的其余部分.您的生产代码实际上将依赖它,但您的测试将依赖于可以在测试中按预期响应的存根实现.
如果你愿意,我可以就这个问题分享一些代码.是的,这是一个疲惫的!
你是如何设法解决这个问题的?