android - 如何正确测试所选主题是浅色模式还是深色模式
问题描述
我是新来测试并尝试在我的片段中测试它:
当用户单击图标时,首先检查所选主题(使用实时数据)。
- 如果所选主题为浅色,则更改为深色模式并断言它是深色模式:
- 否则,如果选定的主题是深色的,则更改为浅色模式并断言它是浅色模式:
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) 处是暗的
解决方案
runOnUiThread
将一个runnable发布到主线程的事件队列,代码稍后执行——因此您的检查发生在主题实际更改之前。(除非你已经在主线程上,在这种情况下你一开始就不需要runOnUiThread
)
您可能希望使用UiThreadTest
注释,以便整个测试在主线程上运行,然后您无需担心异步处理
推荐阅读
- excel - 函数抛出编译错误:在暗线上找不到项目或库
- python - 使用 Django 对搜索结果应用 AND 过滤器
- javascript - 为什么确切的关键字在 NavLink 上不起作用?
- python - Pandas:如何解开每三个索引(行)并扩大数据框?
- html - 如何在单击按钮时向角度表单添加更多文本框?
- javascript - 如何在 Svelte 中定义构建路径?
- html - 上下线重叠
- graphql - 在 GraphQL 中过滤嵌套关系
- dialogflow-es - 我应该如何在默认响应选项卡(不是任何其他平台)中使用自定义有效负载添加多个按钮?
- java - 2个伪代码之间的区别