我有一些 Objective-C [i-os] 代码,我想使用 XCode 运行单元测试。它根据设备类型访问不同的元数据,使用:
[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad
我遇到的问题是,当我运行单元测试时,这个结果总是正确的。理想情况下,能够将其设置为测试运行会很棒。
我猜它可以通过创建一个类来封装设备检查并模拟它以进行测试来完成。但我认为是否有更好的解决方案可能值得一看。
作为引用,nice blog post with many links , 苹果Unit testing guide和 Unit test sample code project .
最佳答案
今天早上我尝试了几种不同的方法:
使用仅链接到我的测试目标的
UIDevice
类别。在该类别中,我将使用partialMock
实现 (OCMock
) 覆盖currentDevice
并 stub 必要的方法,以便它强制将 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()
仍可用于模拟器的其余部分。您的生产代码实际上将依赖于它,但您的测试将依赖于可以在测试中按预期响应的 stub 实现。
如果你愿意,我可以分享一些关于这件事的代码。是的,这是一个令人疲倦的人!
您是如何解决这个问题的?
关于ios - 如何测试依赖于 UIUserInterfaceIdiom (ios) 的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8878042/