在 Android 中模拟 ViewModel 进行 ui 测试

问题描述 投票:0回答:1

我目前正在使用 Kotlin 构建 jetpack 撰写应用程序,但在测试应用程序的导航时遇到困难。

我想模拟我的 ViewModel,这样我的测试就不依赖于 api 等。我尝试了不同的方法来模拟视图模型,但没有一个起作用。我发现要走的路是嘲笑工厂,但我不知道该怎么做。

对于虚拟机的初始化,我有以下工厂:

object AppViewModelProvider {
    val Factory = viewModelFactory {

        initializer {
            FavoriteViewModel(fieldFavoritesApplication().container.favoriteRepository)
        }
    //More initializers...
    }
}

fun CreationExtras.fieldFavoritesApplication(): FieldFavoritesApplication =
    (this[AndroidViewModelFactory.APPLICATION_KEY] as FieldFavoritesApplication)

这是导航主机的函数签名:

fun FieldFavoritesNavHost(
    navController: NavHostController,
    modifier: Modifier = Modifier,
    favoriteViewModel: FavoriteViewModel = viewModel(factory = AppViewModelProvider.Factory)
)

最后是测试本身:

class NavigationTest {

    @get:Rule
    val composeTestRule = createComposeRule()
    lateinit var navController:TestNavHostController

    @Before
    fun setupAppNavHost() {
        composeTestRule.setContent {
            navController = TestNavHostController(LocalContext.current)
            navController.navigatorProvider.addNavigator(ComposeNavigator())
            FieldFavoritesApp(navController)
        }
    }

    @Test
    fun verifyStartDestination()  {
        Assert.assertEquals(LeaguesDestination.route, navController.currentBackStackEntry?.destination?.route)
    }
}

我如何模拟工厂,以便我可以在此测试中使用假视图模型?

android kotlin android-jetpack-compose android-viewmodel
1个回答
0
投票

要在结构类似于

Inventory app
的项目中模拟 ViewModel,您可以在
ViewModel
源集中创建具有相同文件名和位置的
androidTest
文件。例如,如果您的应用程序中的
FavoriteViewModel
包中有
ui.favorites
,请在
ui.favorites
中创建
androidTest
包并将模拟
FavoriteViewModel
实现放在那里,它将代替原始包使用。

或者,您可以以类似的方式保留原始

ViewModel
但模拟存储库。例如,如果您想在
Inventory app
中模拟 ItemsRepository,请创建
TestItemsRepository
,在
ItemsRepository
中实现
androidTest
。然后在
AppContainer
包中创建
data
,它将提供您的测试实现:

override val itemsRepository: ItemsRepository by lazy {
    TestItemsRepository()
}
© www.soinside.com 2019 - 2024. All rights reserved.