我有一个类可以配置为做两个稍微不同的东西。我想测试两条路径。该类是UIViewController
的后代,大多数配置都在Interface Builder中进行。我需要验证两个Storyboard场景及其Outlet是否以相同的方式连接,还需要检查行为的差异。
我想为此目的使用共享的XCTest套件。
一个用于左手,一个用于右手。使用该应用程序时,两者都出现在另一个第一个(右手)触发一个segue到另一个。最后一个(左手)应该触发不同的segue。例如,这就是它的不同之处。
现在我想通过测试验证segues。我想创建一个BothHandSharedTests
套件,它们都会查看控制器实例测试,以验证它们共有的所有内容。但是,BothHandSharedTests
类被视为一个自包含的测试套件,它显然不是。
我想出了这些策略:
你会如何解决这个问题?
答案 0 :(得分:4)
这是Swift的解决方案:
class AbstractTests: XCTestCase {
// Your tests here
override func performTest(run: XCTestRun) {
if self.dynamicType != AbstractTests.self {
super.performTest(run)
}
}
}
答案 1 :(得分:2)
我没有确定的答案,但这就是我最终做的事情。
我首先尝试了子类化路由。在父测试(“AbstractTestCase”)中,我实现了将由AbstractTestCase子类执行的所有测试,但添加了一个宏,因此它们不会被实际的父测试运行:
#define DONT_RUN_TEST_IF_PARENT if ([[self className] isEqualToString:@"AbstractTestCase"]) { return; }
然后我将这个宏添加到每个测试的开头,如下所示:
- (void)testSomething
{
DONT_RUN_TEST_IF_PARENT
... actual test code ...
}
这样,在继承自AbstractTestCase的ConcreteTestCase类中,所有这些测试都将被共享并自动运行。当然,您可以覆盖-setUp来执行必要的特定于类的设置。
然而 - 由于以下几个原因,这是一个糟糕的解决方案:
相反,我现在正在使用一个共享对象TestCaseHelper
,它为每个测试类实例化,并且具有所有测试用例共有的协议/委托模式。它不那么干 - 大多数测试用例只是其他测试用例的重复 - 但至少它们很简单。这样,Xcode就不会混淆,调试失败仍然存在。
更好的解决方案很可能来自Apple,除非您有兴趣放弃整个测试套件。