首页 > 解决方案 > 如何正确测试所选主题是浅色模式还是深色模式

问题描述

我是新来测试并尝试在我的片段中测试它:

当用户单击图标时,首先检查所选主题(使用实时数据)。

HomeFragmentTest.kt

@HiltAndroidTest
@UninstallModules(StorageModule::class)
class HomeFragmentTest{

@get:Rule(order = 0)
var hiltAndroidRule = HiltAndroidRule(this)

@get:Rule(order = 1)
var instantTaskExecutorRule = InstantTaskExecutorRule()

@Inject
lateinit var dataStorage: DataStorage

@Before
fun setUp(){
    hiltAndroidRule.inject()
}

private lateinit var storageViewModel: StorageViewModel
private var selectedTheme: String? = null

@Test
fun testThatThemeIsChangedWhenClicked(){
    storageViewModel = StorageViewModel(dataStorage)
    launchFragmentInHiltContainer<HomeFragment> {
       selectedTheme = storageViewModel.selectedTheme.getOrAwaitValue()
    }

    onView(withId(R.id.ic_theme_mode)).perform(click())

    if (selectedTheme == "light"){
        runOnUiThread {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
            storageViewModel.changeSelectedTheme("dark")
        }
        assertThat(selectedTheme).isEqualTo("dark")
    }

    else if (selectedTheme == "dark"){
        runOnUiThread {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
            storageViewModel.changeSelectedTheme("light")
        }
        assertThat(selectedTheme).isEqualTo("light")
    }
 }
}

StorageViewModel.kt

@HiltViewModel
class StorageViewModel @Inject constructor(private val dataStorage: DataStorage) 
: ViewModel()  {

val selectedTheme = dataStorage.selectedTheme().asLiveData()
fun changeSelectedTheme(theme: String){
    viewModelScope.launch {
        dataStorage.setSelectedTheme(theme)
    }
 }
}

似乎由于某些原因,“ storageViewModel.changeSelectedTheme("dark") ”不起作用。

测试失败,出现以下错误:

预期:黑暗,但在 HomeFragmentTest.testThatThemeIsChangedWhenClicked(HomeFragmentTest.kt:70) 处亮

当我再次运行时,我得到:

预期:亮,但在 HomeFragmentTest.testThatThemeIsChangedWhenClicked(HomeFragmentTest.kt:76) 处是暗的

标签: androidunit-testingkotlintestingandroid-instrumentation

解决方案


runOnUiThread将一个runnable发布到主线程的事件队列,代码稍后执行——因此您的检查发生在主题实际更改之前。(除非你已经在主线程上,在这种情况下你一开始就不需要runOnUiThread

您可能希望使用UiThreadTest注释,以便整个测试在主线程上运行,然后您无需担心异步处理


推荐阅读