加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 17:37:07 所属栏目:百科 来源:网络整理
导读:我有一些Objective-C [i-os]代码,我想使用XCode运行单元测试.它根据设备类型访问不同的元数据,使用: [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad 我遇到的问题是,当我运行单元测试时,此结果始终为真.理想情况下,能够将其设
我有一些Objective-C [i-os]代码,我想使用XCode运行单元测试.它根据设备类型访问不同的元数据,使用:

[[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()仍然可用于模拟器的其余部分.您的生产代码实际上将依赖它,但您的测试将依赖于可以在测试中按预期响应的存根实现.

如果你愿意,我可以就这个问题分享一些代码.是的,这是一个疲惫的!

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读