Използване на библиотеки RxTest и RxBlocking
Днес ще научим как да тестваме нашите RxSwift приложения с помощта на библиотеки RxTest и RxBlocking. Нашият примерен проект следва реактивна MVVM архитектура.
Изходният код на проекта е достъпен в долната част на статията.
Да започваме
Имаме следния екран:
И следната структура вътре в ViewController
:
Можем да видим, че имаме UIStackView
, съдържащо три UIButton
s. Логиката вътре в 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? Чувствайте се свободни да разгледате другите ми подходящи статии, които може да намерите за полезни:
- Как да създадете таймер в RxSwift
- Замяна на делегирането с RxSwift
- Създаване и верига на наблюдаеми последователности в RxSwift
Благодаря за четенето!