原文链接=http://swiftandpainless.com/correction-on-testing-uialertcontroller/
作者=dom
原文日期=2015/11/25
两个月前,我曾发布了一篇 如何测试 UIAlertController 的文章。一个读者发现测试没有如期地起作用:
@dasdom 你的测试是正常的,但是在
MockUIAction中的简便init方法没有被调用。 你不能重写init方法,看起来像是 iOS 的bug。
— Larhythimx (@Larhythmix) 25. November 2015
Larhythimx 说的完全正确。模拟程序的初始化方法从来没有调用。为什么我在写这个测试用例的时候没有发觉呢?那是因为 handler 确实被调用了,看起来就像 UIAlertAction 真的把 handler 作为内部变量去存储动作的 handler 闭包。这是非常脆弱的,并且 Larhythimx 在另一个 tweet 指出在他的测试程序中 handler 是 nil。
所以作为黄金通道(即编写不需要改变实现的测试)走不通,那就退而求其次用别的方法。
首先,我们在 UIAlertAction 中添加一个类方法去创建 action 。在 ViewController.swift 中增加如下扩展:
|
|
在 MockAlertAction 中增加这个重写方法:
|
|
在实现代码中,我们现在可以使用类方法去创建 alert 动作:
|
|
为了确保我们的测试用例正常,如我们预期地工作,将MockAlertAction的 handler 属性重命名为 mockHandler:
此外,我们为动作的模拟标题添加测试。为取消动作的测试应该像这样:
|
|
这个测试在此前的版本将会失败,因为初始化方法没有被调用,因此模拟标题也没有得到设置。
你可以在 github 上找到正确的版本。
再次感谢 Larhythimx 的推特!