【发布时间】:2016-05-18 08:22:33
【问题描述】:
我有一个看起来像这样的XCTestCase 子类。为简洁起见,我删除了 setup() 和 tearDown 方法:
class ViewControllerTests <T : UIViewController>: XCTestCase {
var viewController : T!
final func loadControllerWithNibName(string:String) {
viewController = T(nibName: string, bundle: NSBundle(forClass: ViewControllerTests.self))
if #available(iOS 9.0, *) {
viewController.loadViewIfNeeded()
} else {
viewController.view.alpha = 1
}
}
}
它的子类看起来像这样:
class WelcomeViewControllerTests : ViewControllerTests<WelcomeViewController> {
override func setUp() {
super.setUp()
self.loadControllerWithNibName("welcomeViewController")
// Put setup code here. This method is called before the invocation of each test method in the class.
}
func testName() {
let value = self.viewController.firstNameTextField.text
if value == "" {
XCTFail()
}
}
}
理论上,这应该可以按预期工作——编译器不会抱怨任何事情。但只是当我运行测试用例时,setup() 方法甚至没有被调用。但是,它表示测试已经通过,而 testName() 方法显然应该失败。
使用泛型有问题吗?我可以很容易地想到许多非泛型方法,但我非常想像这样编写我的测试用例。 XCTest 在 Objective-C 和 Swift 之间的互操作性是这里的问题吗?
【问题讨论】:
-
我想你已经回答了你自己的问题:setUp 和 test 没有被调用。你的想法看起来很有用。也许你可以尝试实现一个拉取请求:github.com/apple/swift-corelibs-xctest
-
为什么他们没有被调用,这是个问题。与此同时,我已经实现了一种非常粗糙的方式来做到这一点。让我心潮澎湃。
-
@avisara 你的解决方案是什么?我正在使用 Swift 4,但在使用通用子类时仍然无法运行测试
-
还没找到。再说一次,也没有积极寻找。
-
这真是一团糟。我也看到了同样的情况——如果不允许这样做,编译应该会失败而不是浪费一个小时