测试序列的两种方法

未经请求的代码审查。

最近,我正在阅读使用Swift 3进行测试驱动的iOS开发,并且有一章他们测试从一个UIViewController迁移到另一个。 这让我思考了执行segue / present UIViewController的各种方法以及每种方法的简便性。

我想谈两种方式。

  1. @IBActionUIControl@IBAction一起用于UIViewController并在代码中显示UIViewController -这是本书所建议的
  2. UIControlUIStoryboard segue一起使用

当然,我认为#2(我的方式)更好,但我希望您能读懂并选择适合您和您的项目的方式。

该书建议将UIViewController嵌入UINavigationController ,其中UIBarButtonItem具有IBAction ,该IBAction呈现从UIStoryboard实例化的不同UIViewController

TLDR; 这是一张照片:

测试如下所示:

在我的设置中,我有一个UIStoryboard segue,它带有一个链接两个UIViewController的当前模态选项。

测试如下所示:

确实,没有代码。 这是情节@IBAction文件中的一次单击(基本上),而不是@IBAction ,您可以忘记将其链接到可能错误实现的代码。

好:

  • 更少的代码
  • 清洁代码
  • 更清晰的测试命名
  • UIViewControllerUIStoryboard之间的耦合UIStoryboard
  • 测试标识符。 序列不需要标识符即可工作。 也就是说,如果有一个,稍后将更容易测试两个UIViewController之间的关系,而无需涉及UIBarButtonItem

我对此不满意:

  • 我不喜欢在测试中使用value(forKey:) 。 在这里似乎很有必要,但仍然有种黑涩的代码味道
  • 我认为测试目标是否具有标识符可能更清洁,并且当传递该标识符时, performSegue(withIdentifier:sender:)呈现正确的UIViewController 。 整个performSelector rigamarole似乎有点稠密

我希望这能给您一些启发,帮助您实现对UIStoryboardSegue进行单元测试的方式, UIStoryboardSegue您更多地考虑UIControl

我还希望您注意到这两个解决方案最令我困扰的是,没有人测试过以模态形式呈现UIViewController情况。 现在,您可以将UIStoryboardSegue从“ Show (eg Push)更改为“ UIStoryboardSegue Present Modally而无需中断测试。 作为设置的一部分,可以通过将UIViewController添加到UINavigationController来纠正这种疏忽,但是我认为添加此范围不在本文的讨论范围之内。 只是想提一下。

编码愉快! 如果喜欢的话,留下一些。 如果您认为我错过了一些事情或者可以说得更清楚些,请发表评论。