[英]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.