0

我在如何对我的视图模型功能进行单元测试时遇到问题。

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(),只有在成功时才会恢复并发出状态。现在这测试了行为,但是,如果开发人员删除了依赖调用怎么办?现在测试仍然可以通过而不调用依赖项。

我应该继续测试实现并验证依赖调用吗?还是我应该跳过这个测试?

非常感谢!

4

0 回答 0