I'm trying to create a stand-alone unit test for a DialogFragment, so the DialogFragment can be tested on its own. I'm using FragmentScenario to launch the DialogFragment, right now I'm trying to confirm that the Dialog message is displayed but eventually I'll be testing button clicks.
class ResetScoreDialog (val viewModel: MyViewModel) : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return activity?.let { // Use the Builder class for convenient dialog construction val builder = AlertDialog.Builder(it) builder.setMessage(getString(R.string.resetscore_dialog_message)) .setPositiveButton(getString(R.string.confirm), DialogInterface.OnClickListener { dialog, id -> viewModel.resetScore() }) // Create the AlertDialog object and return it builder.create() } ?: throw IllegalStateException("Activity cannot be null") } } My Test
@RunWith(RobolectricTestRunner::class) class ResetScoreDialogTest { private lateinit var scenario: FragmentScenario<ResetScoreDialog> private lateinit var viewModel: MyViewModel @Before fun setup() { viewModel = mock (MyViewModel::class.java) scenario = launchFragmentInContainer( factory = MainFragmentFactory(viewModel), fragmentArgs = null, themeResId = R.style.Theme_TDDScoreKeeper ) } @Test fun `Dialog Displayed`() { onView(withText(R.string.resetscore_dialog_message)) .check(matches(isDisplayed())) } } When I run the test I get the following error.
androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with string from resource id: <2131755113> View Hierarchy: +>DecorView{id=-1, visibility=VISIBLE, width=320, height=470, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params={(0,0)(fillxfill) ty=BASE_APPLICATION wanim=0x10302f8 fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS pfl=FORCE_DRAW_STATUS_BAR_BACKGROUND}, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1} | +->LinearLayout{id=-1, visibility=VISIBLE, width=320, height=470, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.widget.FrameLayout$LayoutParams@4ed1c9d4, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2} | +-->ViewStub{id=16908682, res-name=action_mode_bar_stub, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, layout-params=android.widget.LinearLayout$LayoutParams@5853ff65, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0} | +-->FrameLayout{id=16908290, res-name=content, visibility=VISIBLE, width=320, height=470, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.widget.LinearLayout$LayoutParams@188c12d2, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=0} Different solutions attempted.
scenario.onFragment { onView(withText(R.string.resetscore_dialog_message)) .check(matches(isDisplayed())) } androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with string from resource id: <2131755113>
onView(withText(R.string.resetscore_dialog_message)) .inRoot(isDialog()) .check(matches(isDisplayed())) androidx.test.espresso.NoMatchingRootException: Matcher 'is dialog' did not match any of the following roots: [Root{application-window-token=android.view.ViewRootImpl$W@b421ae4, window-token=android.view.ViewRootImpl$W@b421ae4, has-window-focus=true, layout-params-type=1, layout-params-string={(0,0)(fillxfill) ty=BASE_APPLICATION wanim=0x10302f8 fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS
scenario.onFragment { onView(withText(R.string.resetscore_dialog_message)) .inRoot(isDialog()) .check(matches(isDisplayed())) } androidx.test.espresso.NoMatchingRootException: Matcher 'is dialog' did not match any of the following roots: [Root{application-window-token=android.view.ViewRootImpl$W@65799e3f, window-token=android.view.ViewRootImpl$W@65799e3f, has-window-focus=true, layout-params-type=1, layout-params-string={(0,0)(fillxfill) ty=BASE_APPLICATION wanim=0x10302f8 fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS
https://stackoverflow.com/questions/67412611/how-to-run-a-unit-test-on-a-dialog-fragment May 06, 2021 at 01:57PM
没有评论:
发表评论