测试序列的两种方法
未经请求的代码审查。
最近,我正在阅读使用Swift 3进行测试驱动的iOS开发,并且有一章他们测试从一个UIViewController
迁移到另一个。 这让我思考了执行segue / present UIViewController
的各种方法以及每种方法的简便性。
我想谈两种方式。
-
@IBAction
将UIControl
与@IBAction
一起用于UIViewController
并在代码中显示UIViewController
-这是本书所建议的 - 将
UIControl
与UIStoryboard
segue一起使用
当然,我认为#2(我的方式)更好,但我希望您能读懂并选择适合您和您的项目的方式。
该书建议将UIViewController
嵌入UINavigationController
,其中UIBarButtonItem
具有IBAction
,该IBAction
呈现从UIStoryboard
实例化的不同UIViewController
。
TLDR; 这是一张照片:
测试如下所示:
在我的设置中,我有一个UIStoryboard
segue,它带有一个链接两个UIViewController
的当前模态选项。
测试如下所示:
确实,没有代码。 这是情节@IBAction
文件中的一次单击(基本上),而不是@IBAction
,您可以忘记将其链接到可能错误实现的代码。
好:
- 更少的代码
- 清洁代码
- 更清晰的测试命名
-
UIViewController
和UIStoryboard
之间的耦合UIStoryboard
- 测试标识符。 序列不需要标识符即可工作。 也就是说,如果有一个,稍后将更容易测试两个
UIViewController
之间的关系,而无需涉及UIBarButtonItem
我对此不满意:
- 我不喜欢在测试中使用
value(forKey:)
。 在这里似乎很有必要,但仍然有种黑涩的代码味道 - 我认为测试目标是否具有标识符可能更清洁,并且当传递该标识符时,
performSegue(withIdentifier:sender:)
呈现正确的UIViewController
。 整个performSelector
rigamarole似乎有点稠密
我希望这能给您一些启发,帮助您实现对UIStoryboardSegue
进行单元测试的方式, UIStoryboardSegue
您更多地考虑UIControl
。
我还希望您注意到这两个解决方案最令我困扰的是,没有人测试过以模态形式呈现UIViewController
情况。 现在,您可以将UIStoryboardSegue
从“ Show (eg Push)
更改为“ UIStoryboardSegue
Present Modally
而无需中断测试。 作为设置的一部分,可以通过将UIViewController
添加到UINavigationController
来纠正这种疏忽,但是我认为添加此范围不在本文的讨论范围之内。 只是想提一下。
编码愉快! 如果喜欢的话,留下一些。 如果您认为我错过了一些事情或者可以说得更清楚些,请发表评论。