我在如何对视图模型功能进行单元测试时遇到问题。
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()
处停止,并且只有在成功的情况下才恢复并发出State。现在,这将测试行为,但是,如果开发人员删除了依赖项调用该怎么办?现在测试仍然可以通过而无需调用依赖项。
我应该继续测试实施并验证依赖项调用吗?还是我应该跳过此测试?
非常感谢!