Използване на библиотеки RxTest и RxBlocking

Днес ще научим как да тестваме нашите RxSwift приложения с помощта на библиотеки RxTest и RxBlocking. Нашият примерен проект следва реактивна MVVM архитектура.

Изходният код на проекта е достъпен в долната част на статията.

Да започваме

Имаме следния екран:

И следната структура вътре в ViewController:

Можем да видим, че имаме UIStackView, съдържащо три UIButtons. Логиката вътре в ViewModel позволява да бъде избран само един бутон:

Сега искаме да тестваме тази логика, но нашите входове и изходи не са просто стойности, те са потоци от данни. Следователно използването само на XCTest не е жизнеспособна опция. RxTest и RxBlocking идват на помощ, позволявайки ни да тестваме асинхронната логика по много лесен начин.

Нека напишем следното във файла ViewModelTests.swift:

Ще използваме свойството testScheduler, когато тестваме логиката с помощта на RxTest и свойството scheduler, когато използваме RxBlocking.

Нека създадем нашия първи тест под метода tearDown():

Тук, както подсказва името на метода, ние твърдим, че всички бутони са деактивирани, когато ViewModel се инстанцира. Не ни интересува времето на събитията, затова използваме XCTAssertRecordedElements.

Нека вместо това създадем друг тест, използвайки RxBlocking:

Ние симулираме поведението в ViewController: когато потребител докосне secondButton, вътре в bindButtonActions(), ние изпращаме false стойности към didSelectFirst и didSelectThird свойствата на ViewModel:

По подобен начин можем да тестваме поведението, когато са избрани firstButton и след това thirdButton:

В резултат на това имаме ViewModel напълно тестван:

Ресурси

„Изходният код“ на проекта е достъпен в GitHub.

Обобщавайки

За да научите повече за RxTest и RxBlocking, посетете официалната документация в GitHub.

Искате ли да научите повече за RxSwift? Чувствайте се свободни да разгледате другите ми подходящи статии, които може да намерите за полезни:

Благодаря за четенето!