From b665b3dc937616ecf7c909169afd818811742792 Mon Sep 17 00:00:00 2001 From: Kevin Worth Date: Mon, 30 Oct 2023 12:41:10 -0400 Subject: [PATCH 1/3] Fix assertEquals calls so expected value comes first --- .../java/android/template/ui/mymodel/MyModelViewModelTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/test/java/android/template/ui/mymodel/MyModelViewModelTest.kt b/app/src/test/java/android/template/ui/mymodel/MyModelViewModelTest.kt index 8e1daa2..7976fe7 100644 --- a/app/src/test/java/android/template/ui/mymodel/MyModelViewModelTest.kt +++ b/app/src/test/java/android/template/ui/mymodel/MyModelViewModelTest.kt @@ -36,13 +36,13 @@ class MyModelViewModelTest { @Test fun uiState_initiallyLoading() = runTest { val viewModel = MyModelViewModel(FakeMyModelRepository()) - assertEquals(viewModel.uiState.first(), MyModelUiState.Loading) + assertEquals(MyModelUiState.Loading, viewModel.uiState.first()) } @Test fun uiState_onItemSaved_isDisplayed() = runTest { val viewModel = MyModelViewModel(FakeMyModelRepository()) - assertEquals(viewModel.uiState.first(), MyModelUiState.Loading) + assertEquals(MyModelUiState.Loading, viewModel.uiState.first()) } } From 18841fb2fbaacaa5fb381d8bcfe4af925e2738a5 Mon Sep 17 00:00:00 2001 From: Kevin Worth Date: Mon, 30 Oct 2023 17:32:33 -0400 Subject: [PATCH 2/3] Set test dispatcher and make Fake more flexible and dynamic --- .../ui/mymodel/MyModelViewModelTest.kt | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/app/src/test/java/android/template/ui/mymodel/MyModelViewModelTest.kt b/app/src/test/java/android/template/ui/mymodel/MyModelViewModelTest.kt index 7976fe7..96a0165 100644 --- a/app/src/test/java/android/template/ui/mymodel/MyModelViewModelTest.kt +++ b/app/src/test/java/android/template/ui/mymodel/MyModelViewModelTest.kt @@ -17,14 +17,22 @@ package android.template.ui.mymodel +import android.template.data.MyModelRepository +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.junit.After import org.junit.Assert.assertEquals +import org.junit.Before import org.junit.Test -import android.template.data.MyModelRepository /** * Example local unit test, which will execute on the development machine (host). @@ -33,27 +41,39 @@ import android.template.data.MyModelRepository */ @OptIn(ExperimentalCoroutinesApi::class) // TODO: Remove when stable class MyModelViewModelTest { + + @Before + fun setUp() { + Dispatchers.setMain(UnconfinedTestDispatcher()) + } + + @After + fun tearDown() { + Dispatchers.resetMain() + } + @Test fun uiState_initiallyLoading() = runTest { val viewModel = MyModelViewModel(FakeMyModelRepository()) - assertEquals(MyModelUiState.Loading, viewModel.uiState.first()) + assertEquals(MyModelUiState.Loading, viewModel.uiState.value) + assertEquals(MyModelUiState.Success(emptyList()), viewModel.uiState.first()) } @Test fun uiState_onItemSaved_isDisplayed() = runTest { val viewModel = MyModelViewModel(FakeMyModelRepository()) - assertEquals(MyModelUiState.Loading, viewModel.uiState.first()) + assertEquals(MyModelUiState.Loading, viewModel.uiState.value) + assertEquals(MyModelUiState.Success(emptyList()), viewModel.uiState.first()) } } private class FakeMyModelRepository : MyModelRepository { - private val data = mutableListOf() + private val data = MutableStateFlow(emptyList()) - override val myModels: Flow> - get() = flow { emit(data.toList()) } + override val myModels: StateFlow> = data.asStateFlow() override suspend fun add(name: String) { - data.add(0, name) + data.update { it.plus(name) } } } From 0101d9afe8770358c1f56c35681f889bd458975f Mon Sep 17 00:00:00 2001 From: Kevin Worth Date: Mon, 30 Oct 2023 17:43:57 -0400 Subject: [PATCH 3/3] Fix test so it does what its name implies --- .../java/android/template/ui/mymodel/MyModelViewModelTest.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/android/template/ui/mymodel/MyModelViewModelTest.kt b/app/src/test/java/android/template/ui/mymodel/MyModelViewModelTest.kt index 96a0165..108ca3e 100644 --- a/app/src/test/java/android/template/ui/mymodel/MyModelViewModelTest.kt +++ b/app/src/test/java/android/template/ui/mymodel/MyModelViewModelTest.kt @@ -62,8 +62,9 @@ class MyModelViewModelTest { @Test fun uiState_onItemSaved_isDisplayed() = runTest { val viewModel = MyModelViewModel(FakeMyModelRepository()) - assertEquals(MyModelUiState.Loading, viewModel.uiState.value) assertEquals(MyModelUiState.Success(emptyList()), viewModel.uiState.first()) + viewModel.addMyModel("Compose") + assertEquals(MyModelUiState.Success(listOf("Compose")), viewModel.uiState.first()) } }