簡體   English   中英

如何在 Dialog 片段上運行單元測試?

[英]How to run a unit test on a Dialog fragment?

我正在嘗試為 DialogFragment 創建一個獨立的單元測試,因此 DialogFragment 可以自行測試。 我正在使用 FragmentScenario 啟動 DialogFragment,現在我正在嘗試確認是否顯示了 Dialog 消息,但最終我將測試按鈕點擊。

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")

    }
}

我的測試

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

當我運行測試時,出現以下錯誤。

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} 

嘗試了不同的解決方案。

        scenario.onFragment {
        onView(withText(R.string.resetscore_dialog_message))
            .check(matches(isDisplayed()))
        }

androidx.test.espresso.NoMatchingViewException:層次結構中找不到匹配的視圖:來自資源 id 的字符串:<2131755113>

        onView(withText(R.string.resetscore_dialog_message))
            .inRoot(isDialog())
            .check(matches(isDisplayed()))

androidx.test.espresso.NoMatchingRootException:匹配器“是對話框”不匹配以下任何根:[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:匹配器“是對話框”不匹配以下任何根:[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

測試DialogFragment launchFragmentInContainer

切換到launchFragment擴展

在您的測試 class 中放置一個類似的 function 並在每次測試之前調用它:

/**
  * Launch YuorDialogFragment dialogfragment
  */
private fun openDialogFragment(): FragmentScenario<YuorDialogFragment> {
  return launchFragment(
    themeResId = R.style.AppTheme
  ) {
    return@launchFragment YuorDialogFragment(
      ViewModelUtil.createFor(mockViewModel)
    );
  }
}

將對話框測試放在androidTest文件夾中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM