我刚刚开始熟悉使用XCTestCase编写测试,并且正在探索它的功能。我有一个简单的(如果是人为的)应用程序,加载一个带有按钮和文本框的屏幕。选择textfield时,视图控制器填充textfield:
public func textFieldDidBeginEditing(_ textField: UITextField) {
textField.text = "abcd"
}在按下按钮时,我还具有选择字段的功能:
@IBAction public func selectField(_ sender: Any?) {
print("button press")
textfield.becomeFirstResponder()
}测试用例中的代码,使用vc.button.sendActions(for: .touchUpInside)编程地点击按钮。
但是,textfield似乎不会成为第一个响应者,因此不会调用委托方法。下面是完整的测试用例类:
var vc: ViewController!
override func setUp() {
let sb = UIStoryboard(name: "Main", bundle: nil)
vc = sb.instantiateInitialViewController() as? ViewController
_ = vc.view
}
override func tearDown() {
}
func test_textfieldPopulatesOnSelection() {
vc.button.sendActions(for: .touchUpInside)
let expectation = XCTestExpectation(description: "waiting for textfield to become first responder")
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
print("textfield.text: \(self.vc.textfield.text ?? "")")
expectation.fulfill()
}
wait(for: [expectation], timeout: 13.0)
}虽然我意识到我可能将UI测试和单元测试的概念混为一谈,但我仍然好奇为什么不调用我的委托方法。
发布于 2018-11-20 00:17:51
我有一个简单的应用程序(如果是人为的),它会加载一个带有按钮和文本字段的屏幕。
不,你没有--至少在“加载屏幕”这一概念的任何意义上都没有。您有一个在setup中创建的视图控制器及其视图,但是您没有对它们做任何事情。视图控制器不是应用程序视图控制器层次结构的一部分,它的视图不在接口中,因此它包含的文本字段不在接口中。没有在接口中的文本字段不会做任何事情。它不可能是第一反应者,因为它没有什么可回应的。第一个应答器是应用程序窗口的一个功能,您的文本字段不在任何窗口中。
无论如何,在这里使用单元测试是错误的。这并不是说你把单元测试和用户界面测试混为一谈,而是你没有对什么是测试进行磨练。没有必要测试这样一个概念,即说becomeFirstResponder是一个文本字段的第一个响应者;您知道这是正确的,所以没有什么需要测试的。您在单元测试中的工作是测试应用程序的功能,而不是测试Cocoa框架。
发布于 2018-11-19 23:49:29
在单元测试中不调用委托方法。测试需要调用委托方法,就像Cocoa调用它们一样。
因此,要测试textFieldDidBeginEditing(_),单元测试需要显式调用它。
https://stackoverflow.com/questions/53380233
复制相似问题