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