【问题标题】:How to properly test if selected theme is light mode or dark mode如何正确测试所选主题是浅色模式还是深色模式
【发布时间】:2021-09-27 06:07:50
【问题描述】:

我刚开始测试并尝试在我的片段中测试它:

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

  • 如果所选主题为浅色,则更改为深色模式并断言它为深色模式:
  • 否则,如果所选主题为深色,则更改为浅色模式并断言它是浅色模式:

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.kt:70)

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

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

【问题讨论】:

    标签: android unit-testing kotlin testing android-instrumentation


    【解决方案1】:

    runOnUiThread 向主线程的事件队列发布一个可运行文件,代码稍后执行 - 因此您的检查发生在主题实际更改之前。 (除非你已经在主线程上,在这种情况下你首先不需要runOnUiThread

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

    【讨论】:

    • 我得到 - 当我在测试中使用 @UiThreadTest 注释时,无法在主应用程序线程(on:main)上调用方法。错误来自 launchFragmentInHiltContainer {} 行
    猜你喜欢
    • 1970-01-01
    • 2020-04-13
    • 2019-08-20
    • 2020-12-21
    • 2021-03-19
    • 2014-05-01
    • 2021-09-11
    • 2020-04-23
    • 1970-01-01
    相关资源
    最近更新 更多