当前位置: 首页 > 面试题库 >

如何测试是否已触发UIControlEvents

广宏远
2023-03-14
问题内容

我有一个UIControl使用方法实现自定义的库,该方法将.valueChanged在调用时触发事件。我想测试该行为的方法。

我的自定义控件:

class MyControl: UIControl {
    func fire() {
        sendActions(for: .valueChanged)
    }
}

和测试:

import XCTest

class ControlEventObserver: NSObject {
    var expectation: XCTestExpectation!

    init(expectation anExpectation: XCTestExpectation) {
        expectation = anExpectation
    }

    func observe() {
        expectation.fulfill()
    }
}

class Tests: XCTestCase {
    func test() {
        let myExpectation = expectation(description: "event fired")
        let observer = ControlEventObserver(expectation: myExpectation)
        let control = MyControl()
        control.addTarget(observer, action: #selector(ControlEventObserver.observe), for: .valueChanged)
        control.fire()
        waitForExpectations(timeout: 1) { error in
            XCTAssertNil(error)
        }
    }
}

问题在于该observe方法永远不会被调用,因此expectation无法实现。

问题是:UIControlEvents在这种情况下,我们如何进行测试?也许我们需要以某种方式强制运行循环?

编辑1:请注意,由于我正在测试库,因此我的测试目标没有任何主机应用程序。当测试目标具有主机应用程序时,以上测试通过。


问题答案:

Apple的UIControl文档指出:

当发生控件特定的事件时,控件立即调用任何关联的操作方法。 动作方法是通过当前的UIApplication对象调度的
,该对象在响应者链之后(如果需要)找到一个合适的对象来处理消息。

sendActions(for:)被称为一个UIControl,控制将调用UIApplicationsendAction(_:to:from:for:)该事件传递到准的目标。

由于我正在测试没有任何主机应用程序的库,因此没有UIApplication对象。因此,.valueChanged不会调度事件,也不会调用该observe方法。



 类似资料:
  • 问题内容: 我试图检测我的sprite节点是否已被触摸并且我不知道从哪里开始。 问题答案: 首先将的属性设置为字符串。 然后在功能上 这是一种方法。 您也可以继承并覆盖其中的内部。 然后做

  • 我在Apex中有一个触发器。如何编写检查触发器是否被调用的单元测试?

  • 问题内容: 我正在做一个拼字游戏程序 在下面的示例中,我下面的代码使用SQLite作为简单数据库来存储我的单词。 但是,它告诉我无法重新创建数据库表。 如何检查是否已经存在一个名为的表,然后跳过尝试创建表的操作? 错误: 编码: 问题答案: 您要查找的查询是: 因此,代码应如下所示: SQLite 3.3+的一个方便的替代方法是使用更智能的查询来创建表: 从文档中: 试图在已经包含相同名称的表,索

  • 本文向大家介绍如何测试JavaScript cookie是否已过期?,包括了如何测试JavaScript cookie是否已过期?的使用技巧和注意事项,需要的朋友参考一下 要测试Cookie是否在JavaScript中过期,请添加以下条件并检查- 您还可以使用单行代码进行检查-

  • 我有一个要求,我必须从Jira触发硒测试。Selenium测试是用编写的。完整的工作流程应该是这样的: 使用任何第三方插件从Jira开始测试执行 该测试将使用jenkins build pipeline在aws中运行 测试完成后,应在Jira中更新结果 我读过关于Jira的X射线插件,但在那里构建必须由jenkins触发,我不需要,因为我希望测试执行由Jira触发。 有没有办法做到这一点? 任何帮

  • 问题内容: 如何测试是否已在python中导入模块? 例如,我需要基础知识: 也 谢谢! 感谢您的所有评论 问题答案: 如果您不想通过两次导入来进行优化,请避免麻烦,因为Python已经解决了这一问题。 如果您 需要 避免此类情况:修正草率的编码- 确保不需要,即在使用之前定义(导入)所有内容(在导入的情况下:一次,在启动时,在模块级别) 。 如果您确实有充分的理由:是一个包含所有已导入到某处的模