我非常相信测试,但不是一个非常优秀的实践者。我已经很好地覆盖了我的模型对象并以TDD风格编程。我实际上非常喜欢它,我很乐意将它扩展到我的控制器层,特别是我的UIViewController
子类。
不幸的是,许多UIKit类在独立测试中不起作用。但是,我对仅在设备上运行我的依赖测试的限制感到不满意。在每次构建之前运行所有单元测试对我来说非常重要,在我看来,单元测试(而不是其他类型的测试)控制器代码是可能的,也是值得的。
我的问题很简单:如何以每次构建之前运行测试的方式测试UIViewController
?我知道这个问题有几个不同的解决方案,但是对于每个问题的各种好处并不了解。
答案 0 :(得分:2)
一般情况下,如果您遇到环境问题,无条件测试似乎无法进行,您可以解决这个问题,如果这些好处足以让您跳过一些环节。
这里的情况是不受欢迎的外部依赖的特殊情况,我通常在单元测试中通过#ifdefing掉一小部分依赖代码,或者通过实现存根类来填充预期的依赖关系角色,我的代码可以进行测试。
因此,在这种特定情况下,您可以创建一个新的源文件,仅在测试包中链接,称为“UIKitStubClasses.m”...在其中您可以实现模拟UIKit依赖类(如UIViewController)的基本必需品,以便你的测试链接并彻底运用他们自己的逻辑。
要记住的重要一点是,这通常不一定是那么多工作。测试将告诉您需要在存根中实现的内容,例如通过发布有关未实现方法的异常。您只需添加安静错误和测试代码所需的内容,然后您的存根类就像任何合法的系统框架类一样用于测试。
答案 1 :(得分:2)
你能否在Chris Hanson的博客中使用提示/方法:http://chanson.livejournal.com/120263.html
似乎您可能需要将您的应用作为测试工具运行,但似乎可行。仅仅因为你正在运行'app'并不意味着它必须要做你的应用程序正常的事情。或者,您可以创建另一个应用程序目标,它只是一个简单的虚拟应用程序,它将加载您的测试包并运行它们。
我同意它可能并不完美,但听起来它可能会起作用,而且它似乎可以自动化。
答案 2 :(得分:2)
所以我对这种情况感到不满,但Daniel和Ed的回答促使我进一步改进。我决定亲自处理事情。
我最后编写的是一个小型Cocoa Touch应用程序,它在-applicationDidFinishLaunching中扫描任何SenTestCase子类的类层次结构并运行它们。与GoogleToolboxForMac的单元测试不同,我尝试尽可能多地使用内置的SenTesting机器,结果它并没有像那么多代码那样结束。除了验证UILabel在没有崩溃测试装置的情况下进行分配之外,我没有做太多测试(如果你尝试的话,otest实际上会崩溃),但它应该可以工作。
答案 3 :(得分:1)
虽然苹果的工具随着时间的推移而有所改进,但它们仍然有很多不足之处。 GHUnit要好得多,有一个真正的测试运行器,并且设置断点等很简单。你甚至可以利用你现有的所有SenTests。
您可以毫无后顾之忧地实例化所有UIKit代码。我用它来测试UIViewControllers,断言插座,并进行行为测试。