A вопрос о событиях управления имеет ответ , что для событий управления требуется экземпляр UIApplication
для отправки действий. К сожалению, вопрос не указывает, как это можно сделать.
Здесь также есть код , который использует swizzling для исправления реализации отправки действия на UIControl
, чтобы он неделегат UIApplication
. Он не строится с недавним быстрым использованием, потому что он опирается на переопределение initialize
- однако это может быть исправлено.
Я выбрал подход к реализации расширения на UIControl
для использования в тестах, которыепредоставляет метод simulateEvent(_ event: UIControl.Event)
, который выглядит следующим образом:
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
. Я также чувствую, что он неинвазивен и принимает тот факт, что модульное тестирование не выполняется в полной среде приложения, поэтому тесты не могут использовать полную обработку ответов.