5

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

[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad

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

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

作为参考,一篇不错的博客文章,包含许多链接、Apple单元测试指南单元测试示例代码项目

4

1 回答 1

5

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

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

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

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

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

你是如何设法解决这个问题的?

于 2012-07-01T17:01:51.317 回答