Как выполнить модульное тестирование функций, которые просто вызывают функцию зависимости, которая ничего не возвращает? - PullRequest
0 голосов
/ 10 июня 2019

У меня проблемы с модульным тестированием функции модели представления.

class MyViewModel(
    private val dependency: Dependency
) : ViewModel() {
    private val _myFunctionState = MutableLiveData<State>()
    val myFunctionState: LiveData<State> = _myFunctionState   

    fun myFunction() {
        viewModelScope.launch(CoroutineExceptionHandler { _, throwable -> 
            _myFunctionState.postValue(State.Error(throwable)
        }) {
            _myFunctionState.postValue(State.Loading)
            dependency.callFunction()
            _myFunctionState.postValue(State.Success)
        }
    }
}

Теперь, если dependency.callFunction() что-то вернуть, я мог бы легко проверить, получил ли я значение и выполнитьутверждение типа liveData.value shouldBe valueFromFunction, но в этом случае функция просто выполняет что-то

Я рассмотрел использование проверки для проверки

fun test_myFunction() {
    val dependency = mockk<Dependency>(relaxed = true)
    val viewModel = MyViewModel(dependency)

    viewModel.myFunction()

    coVerify { dependency.callFunction() }
    confirmVerified(dependency)
}

Но если я пойду по этому пути, это уже тестированиедетали реализации.Я должен был проверить поведение, поэтому я решил проверить состояние

fun test_myFunction() {
    val dependency = mockk<Dependency>(relaxed = true)
    val viewModel = MyViewModel(dependency)

    viewModel.myFunction()

    viewModel.myFunctionState.value shouldBe State.Success
}

Так как это сопрограмма, выполнение остановится на dependency.callFunction() и возобновит и выдаст состояние только в случае успеха.Теперь это тестирует поведение, однако, что, если разработчик удаляет вызов зависимости?Теперь тест будет по-прежнему проходить без вызова зависимости.

Стоит ли просто проверить реализацию и проверить вызов зависимости?Или мне просто пропустить этот тест?

Большое спасибо!

...