Как вручную вызвать распознаватель жестов, зарегистрированный в RxSwift? - PullRequest
0 голосов
/ 07 сентября 2018

В моем коде я делаю это так:

let recognizer = UITapGestureRecognizer()
mainView.messagesView.addGestureRecognizer(recognizer)
_ = recognizer.rx.event.bind { _ in
    self.mainView.dismissKeyboard()
}.disposed(by: bag)

Но теперь мне нужно проверить это:

func testIfKeyboardIsDismissedAfterMessageViewWasTapped() {
    let view = ThreadView()
    let model = StubThreadViewModel()
    let controller = ThreadViewController(view: view, viewModel: model)
    controller.viewDidLoad()
    let window = UIWindow()
    window.addSubview(view)
    view.textView.becomeFirstResponder()
    XCTAssertTrue(view.textView.isFirstResponder) //TRUE, test passes
    view.messageView. //Here I dont know how to force tap manually
    XCTAssertFalse(view.textView.isFirstResponder) //FALSE, test fails
}

1 Ответ

0 голосов
/ 07 сентября 2018

UIView имеет свойство gestureRecognizers, которое позволяет получить все распознаватели в представлении. Вы можете использовать это, чтобы изменить состояние распознавателя, и это должно работать? Что-то вдоль линий ниже

UIGestureRecognizer *gestureRec = view.messagesView.gestureRecognizers.firstObject;
gestureRec.state = UIGestureRecognizerStateChanged;
gestureRec.state = UIGestureRecognizerStateEnded;

РЕДАКТИРОВАТЬ - это будет работать только в асинхронном режиме, так как событие будет запущено в следующем цикле выполнения. Похоже, что единственный способ вызвать его принудительно и синхронно (асинхронные тесты противны!) - это взломать что-то вроде this

ПРИМЕЧАНИЕ - не используйте этот код при доставке!

...