如何测试依赖于UIUserInterfaceIdiom(ios)的代码

时间:2012-01-16 09:37:27

标签: ios xcode unit-testing octest

我有一些Objective-C [i-os]代码,我想使用XCode运行单元测试。它使用以下命令访问不同的元数据,具体取决于设备类型:

[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad

我遇到的问题是,当我运行单元测试时,此结果始终为真。理想情况下,能够将其设置为测试运行会很棒。

我认为可以做到的方法是创建一个封装设备检查的类并模拟测试。但我认为,如果有更好的解决方案,可能值得一试。

供参考,nice blog post with many links,Apple Unit testing guideUnit test sample code project

1 个答案:

答案 0 :(得分:4)

今天早上我尝试了几种不同的方法:

  1. 使用仅与我的测试目标相关联的UIDevice类别。在该类别中,我将使用currentDevice实现(partialMock)覆盖OCMock并存根必要的方法,以便强制返回Pad或Phone到我的特定测试。它应该有效,但很难弄清UIDeviceUIApplication这样的类,模拟器经常会崩溃,这是一个不好的迹象。

  2. 在我的测试#undef UI_INTERFACE_IDIOM()
  3. #define.pch。将测试中的UI_INTERFACE_IDIOM()实现指向我自己的单例实例,我可以相应地设置为Pad或Phone。这是有效的,但主要的问题是,当你运行测试时,模拟器也会上升(应用程序测试),所以如果你在iPad上运行测试,你的测试将会通过,但模拟器的其他部分将会失败,因为它来自UI_INTERFACE_IDIOM()的矛盾反应(其中一个是如果你在通用应用程序环境中加载nib特定的iPhone)

  4. 我认为这是最好的方法。作为计算机科学中的一切,只需将另一层放入=)而不是使用UI_INTERFACE_IDIOM()来评估它是否在Pad或Phone设备上的代码,而是将此逻辑封装在您可以在测试期间模拟的对象中。那样UI_INTERFACE_IDIOM()仍可用于模拟器的其余部分。您的生产代码实际上将依赖它,但您的测试将依赖于可以在测试中按预期响应的存根实现。

  5. 如果您愿意,我可以就此事分享一些代码。是的,这是一个疲惫的人!

    您是如何设法解决此问题的?