我有一个类,它可以被配置成做2个稍微不同的事情。 我想测试这两种路径。这个类是 UIViewController
我需要验证故事板场景和它们的输出端是否以同样的方式连接,但也需要检查行为的不同。
我想使用共享的XCTest套件来达到这个目的。
一个是针对左手使用的,一个是针对右手使用的。在使用应用程序时,两者都会相继出现。第一个(右手)会触发到另一个的切换。最后一个(左手)应该会触发不同的转场。例如,这就是它的不同之处。
现在我想用测试来验证这些转场。 我想创建一个 BothHandSharedTests
套件,这两个视图控制器实例测试都用来验证它们的所有共同点。然而, BothHandSharedTests
类被视为一个自包含的测试套件,但它显然不是。
我想出了这些策略。
你会如何解决这个问题?
我没有确凿的答案,但这是我最后的做法。
我首先尝试了子类化路线。在父测试("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
,它是为每个测试类实例化的,并且有一个所有测试用例通用的协议委托模式。它不那么DRY--大多数测试用例只是其他测试用例的重复--但至少它们是简单的。这样一来,Xcode就不会感到困惑,而且调试失败还是有可能的。
更好的解决方案很可能要来自Apple,除非你有兴趣抛弃你的整个测试套件去做别的事情。
这里有一个Swift中的解决方案。
class AbstractTests: XCTestCase {
// Your tests here
override func perform(_ run: XCTestRun) {
if type(of: self) != AbstractTests.self {
super.perform(run)
}
}
}