首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XCTestCase的UIButton抽头

XCTestCase的UIButton抽头
EN

Stack Overflow用户
提问于 2019-10-23 09:17:37
回答 1查看 914关注 0票数 3

我正在尝试单元测试UIViewController中按钮点击的连接,但我发现这些测试失败了,尽管运行中的应用程序中的代码运行良好。

我简化了失败的测试,删除了视图控制器,然后简单地离开了:

代码语言:javascript
复制
import XCTest

class ButtonTest: XCTestCase {

    var gotTap: XCTestExpectation!

    func test_givenButtonWithTargetForTapAction_whenButtonIsSentTapAction_thenTargetIsCalled() {

        gotTap = expectation(description: "Button tap recieved")

        let button = UIButton()
        button.addTarget(self, action: #selector(tap), for: .touchUpInside)

        button.sendActions(for: .touchUpInside)

        // Fails.
        wait(for: [gotTap], timeout: 0.1)
    }

    @objc func tap() {
        gotTap.fulfill()
    }
}

这项测试确实:

  • 将动作连接到满足测试期望的按钮上
  • 使用button.sendActions(for: .touchUpInside)点击按钮
  • 等待期待。

失败的原因是:

异步等待失败:超过了0.1秒的超时,未实现预期:“按钮点击接收”。

我不想为此使用UI测试。它们的执行速度要慢很多数量级,在这里,单元测试应该是理想的。

问题

  • 这是因为UIButton操作发送需要对响应链进行额外设置而导致失败吗?还是这里不存在的运行循环?还是别的什么?如何在不实例化完整运行的应用程序的情况下,在单元测试中将其设置为最低限度?
  • 最初,我尝试在没有期望的情况下同步测试按钮点击(这也不起作用,所以我想我应该异步地尝试)--如果您可以帮助实现此工作,还请指出操作发送是同步的还是异步的。
EN

回答 1

Stack Overflow用户

发布于 2019-10-23 10:57:04

关于控制事件的问题具有控制事件需要UIApplication实例才能发送操作的回答。不幸的是,这个问题并没有说明如何做到这一点。

还有一些代码这里使用swizzling来修补在UIControl上发送的操作的实现,这样它就不会委托给UIApplication。因为它依赖于覆盖initialize,所以它并不是最近才构建的--不过,这可能是可以修复的。

我采取的方法是在UIControl上实现一个扩展,以便在测试中使用,该扩展提供了一个方法simulateEvent(_ event: UIControl.Event),如下所示:

代码语言:javascript
复制
extension UIControl {

    func simulateEvent(_ event: UIControl.Event) {
        for target in allTargets {
            let target = target as NSObjectProtocol
            for actionName in actions(forTarget: target, forControlEvent: event) ?? [] {
                let selector = Selector(actionName)
                target.perform(selector)
            }
        }
    }
}

可以对此进行改进,以正确检查选择器,并确定是否也应该发送发送方和事件,但这是概念的合理证明,允许在XCUnitTest中发送按钮。我还觉得它是非侵入性的,并且接受了一个单元测试没有在一个完整的应用程序环境中运行的事实,所以测试不能使用完整的响应程序处理。

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

https://stackoverflow.com/questions/58519479

复制
相关文章

相似问题

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