Как мне проверить поток / порядок выполнения? - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь добавить функцию для отображения экрана загрузки в этом коде:

func connect(with code: String) {
    interactor.connect(with: code)
        .subscribe(onNext: { displaySuccessScreenRelay.accept(()) },
                   onError: { displayErrorScreenRelay.accept(()) } )
        .disposed(by: disposeBag)
}

Я сделал реле поведения под названием loadingScreenShownRelay объявление. Я знаю, что правильный способ сделать это, как this:

func connect(with code: String) {
    loadingScreenShownRelay.accept(true)
    interactor.connect(with: code)
        .subscribe(onNext: { 
                       displaySuccessScreenRelay.accept(())
                       loadingScreenShownRelay.accept(false)
                   },
                   onError: { 
                       displayErrorScreenRelay.accept(()) 
                       loadingScreenShownRelay.accept(false)
        })
        .disposed(by: disposeBag)
}

Теперь вопрос заключается в том, как изменить порядок проверки, чтобы можно было проверить не только логи c, но и порядок showLoading -> success -> hideLoading?

Я могу, вероятно, протестировать дисплеи и загрузку наблюдаемых ScreenShown отдельно в 2 теста (ie. Один для проверки логики c из input-> emit display success / error и еще один для проверки loadingScreenShown). Но откуда мне знать, что заказ действительно был showLoading -> success -> hideLoading? Если я выполняю тесты безотносительно к заказу, я также могу сделать это, и тесты будут по-прежнему go зелеными.

func connect(with code: String) {
    loadingScreenShownRelay.accept(true)
    loadingScreenShownRelay.accept(false)
    interactor.connect(with: code)
        .subscribe(onNext: { displaySuccessScreenRelay.accept(()) },
                   onError: { displayErrorScreenRelay.accept(()) } )
        .disposed(by: disposeBag)
}

Заранее спасибо.

1 Ответ

1 голос
/ 13 февраля 2020

Императивный код, такой как у вас, может быть сложным для тестирования. Вам нужно будет протестировать весь класс, и вам потребуется поддельный Interactor.

Такой тест покажет, что ваше реле экрана загрузки работает:

class ExampleTests: XCTestCase {

    func test() {
        let scheduler = TestScheduler(initialClock: 0)
        let sut = Example(interactor: FakeInteractor(connect: { _ in
            scheduler.createColdObservable([.next(10, ()), .completed(10)]).asObservable()
        }))
        let result = scheduler.createObserver(Bool.self)

        _ = sut.loadingScreenShownRelay
            .bind(to: result)

        sut.connect(with: "foo")

        scheduler.start()

        XCTAssertEqual(result.events, [.next(0, true), .next(10, false)])
    }
}

Вы можете увидеть в утверждение, что истинное событие предшествует ложному событию, и они разделены единицами времени, необходимыми для излучения интерактора.

В приведенном выше примере используется библиотека RxTest.

...