Как мне выполнить модульное тестирование RxJava Completable функции doOnSuccess? - PullRequest
0 голосов
/ 03 сентября 2018

Я видел, как проверить наблюдаемое с помощью TestSubscriber, но я не знаю, как проверить Completable.doOnSuccess обратный вызов. Конкретно этот метод:

fun setAuthToken(authToken: AuthToken): Completable {
    this.authToken = authToken

    return Completable.fromSingle<User>(api
            .getCurrentUser()
            .doOnSuccess {
                user = it
            })
}

1 Ответ

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

Это не то, что вообще не нужно тестировать с тестовыми подписчиками RxJava (в зависимости от остальной части кода).

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

Таким образом, вы могли бы сделать Completable блокировку и затем установить состояние (скажем, серверного) класса сервера, но Я бы настоятельно не рекомендовал делать это следующим образом:

server.setAuthToken(AuthToken("token"))
            .blockingAwait()
assertThat(server.user, equalTo(expectedUser))

То, что вы хотите проверить, это поведение.

Вы, вероятно, не назначаете пользователя для поля только ради наличия некоторых полей. Вы делаете это, чтобы использовать информацию от пользователя позже. Поэтому сначала вы должны вызвать setAuthToken и , а затем вызвать функцию, которая действительно использует информацию от пользователя. Затем вы можете утверждать, что использованная информация верна и исходит от правильного пользователя.

Таким образом, примеры тестов (в зависимости от класса) могут выглядеть следующим образом:

server.setAuthToken(AuthToken("token"))
        .andThen(server.sendRequest())
        .blockingAwait()
    // assert if correct user info was sent

или

server.setAuthToken(AuthToken("token"))
    .andThen(server.sendRequest())
    .test()
    // assert if correct user info was sent
...