首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UITextFieldDelegate未在XCTestCase中调用

UITextFieldDelegate未在XCTestCase中调用
EN

Stack Overflow用户
提问于 2018-11-19 17:57:47
回答 2查看 982关注 0票数 0

我刚刚开始熟悉使用XCTestCase编写测试,并且正在探索它的功能。我有一个简单的(如果是人为的)应用程序,加载一个带有按钮和文本框的屏幕。选择textfield时,视图控制器填充textfield:

代码语言:javascript
运行
复制
public func textFieldDidBeginEditing(_ textField: UITextField) {
    textField.text = "abcd"
}

在按下按钮时,我还具有选择字段的功能:

代码语言:javascript
运行
复制
@IBAction public func selectField(_ sender: Any?) {
    print("button press")
    textfield.becomeFirstResponder()
}

测试用例中的代码,使用vc.button.sendActions(for: .touchUpInside)编程地点击按钮。

但是,textfield似乎不会成为第一个响应者,因此不会调用委托方法。下面是完整的测试用例类:

代码语言:javascript
运行
复制
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测试和单元测试的概念混为一谈,但我仍然好奇为什么不调用我的委托方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-20 00:17:51

我有一个简单的应用程序(如果是人为的),它会加载一个带有按钮和文本字段的屏幕。

不,你没有--至少在“加载屏幕”这一概念的任何意义上都没有。您有一个在setup中创建的视图控制器及其视图,但是您没有对它们做任何事情。视图控制器不是应用程序视图控制器层次结构的一部分,它的视图不在接口中,因此它包含的文本字段不在接口中。没有在接口中的文本字段不会做任何事情。它不可能是第一反应者,因为它没有什么可回应的。第一个应答器是应用程序窗口的一个功能,您的文本字段不在任何窗口中。

无论如何,在这里使用单元测试是错误的。这并不是说你把单元测试和用户界面测试混为一谈,而是你没有对什么是测试进行磨练。没有必要测试这样一个概念,即说becomeFirstResponder是一个文本字段的第一个响应者;您知道这是正确的,所以没有什么需要测试的。您在单元测试中的工作是测试应用程序的功能,而不是测试Cocoa框架。

票数 1
EN

Stack Overflow用户

发布于 2018-11-19 23:49:29

在单元测试中不调用委托方法。测试需要调用委托方法,就像Cocoa调用它们一样。

因此,要测试textFieldDidBeginEditing(_),单元测试需要显式调用它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53380233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档