वर्चुअल कीबोर्ड आपके एस्प्रेसो टेस्ट को बाधित कर सकता है
हमेशा की तरह, मैं कुछ तकनीकों को सीखने के लिए अपने साइड प्रोजेक्ट पर काम कर रहा था, इस बार यह एस्प्रेसो था। हालाँकि मैं एक ऐसे जाल में फंस गया जो मुझे एक परीक्षा पास करने से रोकता है।
![](https://post.nghiatu.com/assets/images/m/max/724/1*qtTxgE9YZMf3UoZfa6yX4A.png)
कसौटी
@Test
fun testEmptyNameInput() {
launchFragmentInHiltContainer<FirstTodoListFragment> {
navController.setGraph(R.navigation.nav_main)
navController.setCurrentDestination(R.id.firstTodoListFragment)
Navigation.setViewNavController(requireView(), navController)
}
onView(withId(R.id.next_btn)).perform(click())
runTest {
repository.queryTodoList().test {
val res = awaitItem()
res.size shouldBeEqualTo 1
res.first().name shouldBeEqualTo context.getString(R.string.default_list_name)
cancelAndIgnoreRemainingEvents()
}
}
navController.currentDestination?.id shouldBeEqualTo R.id.listFragment
}
![](https://post.nghiatu.com/assets/images/m/max/724/1*VoL2FpunVGaz3iJ0rEucnA.png)
मैंने टेस्ट लॉजिक और व्यू मॉडल लॉजिक दोनों की जाँच की, कुछ भी गलत नहीं होना चाहिए। तो मैंने अपने बटन क्लिक श्रोता पर ब्रेकपॉइंट लगाने का फैसला किया। डिबग मोड में फिर से परीक्षण चलाएं, बस यह ध्यान देने के लिए कि ब्रेकपॉइंट ट्रिगर नहीं हुआ।
![](https://post.nghiatu.com/assets/images/m/max/724/1*fXgvs6sSMrkGhyyUk6mSlw.png)
ऐसा क्यों था? मैंने अपने तर्क को फिर से जाँचने में घंटों बिताए, कई संभावित संयोजनों की कोशिश की, मुझे अपराधी मिल गया।
private fun FragmentFirstTodoListBinding.setupInput() {
listNameInputLayout.root.hint = getString(R.string.list_name)
TextInputUtil.showKeyboard(requireActivity(), listNameInputLayout.input) // the culprit
listNameInputLayout.input.doOnTextChanged { text, _, _, _ ->
viewModel.setInputName(text.toString())
}
}
लेकिन एक उपयोगिता विधि क्यों है जो वर्चुअल कीबोर्ड दिखाती है जिससे परीक्षण विफल हो जाता है? मेरा व्यक्तिगत अनुमान है कि यह बटन को ऊपर धकेल देगा, जिससे एस्प्रेसो उस पर क्लिक करने से चूक जाएगा।
![](https://post.nghiatu.com/assets/images/m/max/724/1*6Jtcqe5CgcicwiO5AIkBjw.png)
समाधान
![](https://post.nghiatu.com/assets/images/m/max/724/1*gnb6oRhIgZnvSr9elkC01w.png)
बटन को ऊपर ले जाएँ
![](https://post.nghiatu.com/assets/images/m/max/724/1*5Fvi-OBRtZR7OkuoFe3VaQ.png)
निश्चित रूप से, अब परीक्षण पास हो गया है, लेकिन क्या होगा यदि मैं बटन को स्थानांतरित नहीं करना चाहता हूं?
परीक्षण में बटन क्लिक करने से पहले जोड़ेंpressBack()
@Test
fun testEmptyNameInput() {
launchFragmentInHiltContainer<FirstTodoListFragment> {
navController.setGraph(R.navigation.nav_main)
navController.setCurrentDestination(R.id.firstTodoListFragment)
Navigation.setViewNavController(requireView(), navController)
}
pressBack() //added to the test
onView(withId(R.id.next_btn)).perform(click())
runTest {
repository.queryTodoList().test {
val res = awaitItem()
res.size shouldBeEqualTo 1
res.first().name shouldBeEqualTo context.getString(R.string.default_list_name)
cancelAndIgnoreRemainingEvents()
}
}
navController.currentDestination?.id shouldBeEqualTo R.id.listFragment
}
इस लेख में खिलौना परियोजना:https://github.com/BNSC1/Todo