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

标签 ios xcode unit-testing octest

我有一些 Objective-C [i-os] 代码,我想使用 XCode 运行单元测试。它根据设备类型访问不同的元数据,使用:

[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad

我遇到的问题是,当我运行单元测试时,这个结果总是正确的。理想情况下,能够将其设置为测试运行会很棒。

我猜它可以通过创建一个类来封装设备检查并模拟它以进行测试来完成。但我认为是否有更好的解决方案可能值得一看。

作为引用,nice blog post with many links , 苹果Unit testing guideUnit test sample code project .

最佳答案

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

  1. 使用仅链接到我的测试目标的 UIDevice 类别。在该类别中,我将使用 partialMock 实现 (OCMock) 覆盖 currentDevice 并 stub 必要的方法,以便它强制将 Pad 或 Phone 返回给我具体测试。它应该可以工作,但很难与 UIDeviceUIApplication 等类混淆,模拟器经常崩溃,这是一个不好的迹象。

  2. #undef UI_INTERFACE_IDIOM()#define 它在我的测试 .pch 中。将测试中的 UI_INTERFACE_IDIOM() 实现指向我自己的单例实例,我可以相应地将其设置为 Pad 或 Phone。这行得通,但主要问题是,当您运行测试时,模拟器也会启动(即应用程序测试),因此如果您在 iPad 上运行测试,您的测试将通过,但模拟器的其他部分将失败,因为它从 UI_INTERFACE_IDIOM() 获得的矛盾响应(其中之一是在通用应用程序环境中加载特定于 iPhone 的 Nib )

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

如果你愿意,我可以分享一些关于这件事的代码。是的,这是一个令人疲倦的人!

您是如何解决这个问题的?

关于ios - 如何测试依赖于 UIUserInterfaceIdiom (ios) 的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8878042/

相关文章:

ios - 包括键盘的 iPhone 快照

ios - 拖动进入时突出显示按钮

ios - <错误> : ImageIO: PNG invalid PNG file: extra chunks between iDOT and IDAT

ios - 如何将数据从 UIContainerView 传递到位于同一父 View Controller 中的另一个 UIContainerView?

unit-testing - 单元测试 - 如何将带逗号的字符串传递到 DUnitX 中的测试用例

java - 运行 GAE/J 测试用例时如何隐藏来自 LocalServiceTestHelper 的 INFO 消息?

ios - 模态呈现时的交互式过渡

ios - 从登录重定向

xcode - 在 Mac OS X 中使用 swift 我想在运行时移动标签/文本框控件?

.net - 以编程方式跳过 NUnit 测试