वर्चुअल कीबोर्ड आपके एस्प्रेसो टेस्ट को बाधित कर सकता है

Apr 20 2023
हमेशा की तरह, मैं कुछ तकनीकों को सीखने के लिए अपने साइड प्रोजेक्ट पर काम कर रहा था, इस बार यह एस्प्रेसो था। हालाँकि मैं एक ऐसे जाल में फंस गया जो मुझे एक परीक्षा पास करने से रोकता है।
Unsplash पर क्रेग मैके द्वारा फोटो

हमेशा की तरह, मैं कुछ तकनीकों को सीखने के लिए अपने साइड प्रोजेक्ट पर काम कर रहा था, इस बार यह एस्प्रेसो था। हालाँकि मैं एक ऐसे जाल में फंस गया जो मुझे एक परीक्षा पास करने से रोकता है।

परीक्षण के लिए टुकड़ा

कसौटी

@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
}

विफल परीक्षण

मैंने टेस्ट लॉजिक और व्यू मॉडल लॉजिक दोनों की जाँच की, कुछ भी गलत नहीं होना चाहिए। तो मैंने अपने बटन क्लिक श्रोता पर ब्रेकपॉइंट लगाने का फैसला किया। डिबग मोड में फिर से परीक्षण चलाएं, बस यह ध्यान देने के लिए कि ब्रेकपॉइंट ट्रिगर नहीं हुआ।

बॉटन क्लिक लिसनर पर ब्रेकप्वाइंट

ऐसा क्यों था? मैंने अपने तर्क को फिर से जाँचने में घंटों बिताए, कई संभावित संयोजनों की कोशिश की, मुझे अपराधी मिल गया।

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())
    }
}

लेकिन एक उपयोगिता विधि क्यों है जो वर्चुअल कीबोर्ड दिखाती है जिससे परीक्षण विफल हो जाता है? मेरा व्यक्तिगत अनुमान है कि यह बटन को ऊपर धकेल देगा, जिससे एस्प्रेसो उस पर क्लिक करने से चूक जाएगा।

पुश अप बटन का चित्रण

समाधान

उत्तीर्ण परीक्षा

बटन को ऊपर ले जाएँ

ले जाया गया बटन

निश्चित रूप से, अब परीक्षण पास हो गया है, लेकिन क्या होगा यदि मैं बटन को स्थानांतरित नहीं करना चाहता हूं?

परीक्षण में बटन क्लिक करने से पहले जोड़ें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