Swift: XCTest Class 'FirstDemoTests' 没有初始化器
Swift: XCTest Class 'FirstDemoTests' has no initializers
我有以下代码(试图避免隐式展开):
class MyTests: XCTestCase {
var viewController: ViewController
}
但我收到以下错误:
Class 'MyTests' has no initializers
我解决了这个问题:
class MyTests: XCTestCase {
var viewController: ViewController
override init() {
self.viewController = ViewController()
super.init()
}
}
在 XCTest class 中使用 init()
会有问题吗?
我正在使用 Swift 4,Xcode 9.2.
写 XCTest 时就不需要写初始化程序了。
XCTestCase
提供在执行实际测试之前准备测试项目的方法。
声明 viewController 为显式展开(以避免隐式展开),如下所示。
class MyTests: XCTestCase {
var viewController: ViewController!
}
总是在您的每个 XCTestCase
class.
中重写以下 2 个方法
setUp
是在实际测试执行前准备变量。在 setUp
.
中初始化 viewController
override func setUp() {
super.setUp()
self.viewController = ViewController()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
tearDown
是测试完成后释放变量和其他资源。在 tearDown
.
发布 viewController
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class
self.viewController = nil
super.tearDown()
}
我知道你想避免隐式解包,但不幸的是(除非你想经历编写自己的测试的麻烦 运行ner),你无法控制哪个初始化器当测试为 运行.
时调用
如您所知,您可以通过隐式展开并在 setUp()
中设置 属性 的值来解决此问题,它在每次测试之前都会被调用,因此您可以确定 属性 在你的测试中不会是 nil。这样比较安全。
class MyTests: XCTestCase {
var viewController: ViewController!
override function setUp() {
super.setUp()
self.viewController = ViewController()
}
}
或者,您可以使 属性 lazy
,这意味着它不必隐式解包。这意味着 属性 不必在对象初始化期间进行初始化,因此您无需编写新的初始化程序,但会在第一次访问时进行初始化。
class MyTests: XCTestCase {
lazy var viewController: ViewController = {
return ViewController()
}()
}
实际上,setup()
在每次测试方法调用中调用。
/*!
* @method -setUp
* Setup method called before the invocation of each test method in the class.
*/
- (void)setUp;
那么,为什么你需要为当前 XCTests
子类中的 3 个测试方法创建 viewController,比如说 3 次?
您可以尝试在 XCTests 子类之外声明您的变量
我有以下代码(试图避免隐式展开):
class MyTests: XCTestCase {
var viewController: ViewController
}
但我收到以下错误:
Class 'MyTests' has no initializers
我解决了这个问题:
class MyTests: XCTestCase {
var viewController: ViewController
override init() {
self.viewController = ViewController()
super.init()
}
}
在 XCTest class 中使用 init()
会有问题吗?
我正在使用 Swift 4,Xcode 9.2.
写 XCTest 时就不需要写初始化程序了。
XCTestCase
提供在执行实际测试之前准备测试项目的方法。
声明 viewController 为显式展开(以避免隐式展开),如下所示。
class MyTests: XCTestCase {
var viewController: ViewController!
}
总是在您的每个 XCTestCase
class.
setUp
是在实际测试执行前准备变量。在 setUp
.
override func setUp() {
super.setUp()
self.viewController = ViewController()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
tearDown
是测试完成后释放变量和其他资源。在 tearDown
.
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class
self.viewController = nil
super.tearDown()
}
我知道你想避免隐式解包,但不幸的是(除非你想经历编写自己的测试的麻烦 运行ner),你无法控制哪个初始化器当测试为 运行.
时调用如您所知,您可以通过隐式展开并在 setUp()
中设置 属性 的值来解决此问题,它在每次测试之前都会被调用,因此您可以确定 属性 在你的测试中不会是 nil。这样比较安全。
class MyTests: XCTestCase {
var viewController: ViewController!
override function setUp() {
super.setUp()
self.viewController = ViewController()
}
}
或者,您可以使 属性 lazy
,这意味着它不必隐式解包。这意味着 属性 不必在对象初始化期间进行初始化,因此您无需编写新的初始化程序,但会在第一次访问时进行初始化。
class MyTests: XCTestCase {
lazy var viewController: ViewController = {
return ViewController()
}()
}
实际上,setup()
在每次测试方法调用中调用。
/*!
* @method -setUp
* Setup method called before the invocation of each test method in the class.
*/
- (void)setUp;
那么,为什么你需要为当前 XCTests
子类中的 3 个测试方法创建 viewController,比如说 3 次?
您可以尝试在 XCTests 子类之外声明您的变量