У меня проблемы с модульным тестированием функции модели представления.
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()
и возобновит и выдаст состояние только в случае успеха.Теперь это тестирует поведение, однако, что, если разработчик удаляет вызов зависимости?Теперь тест будет по-прежнему проходить без вызова зависимости.
Стоит ли просто проверить реализацию и проверить вызов зависимости?Или мне просто пропустить этот тест?
Большое спасибо!