Android Espresso: совпадения намерений и androidx PreferenceFragments - PullRequest
0 голосов
/ 24 сентября 2019

Я недавно перенес свою реализацию предпочтений на использование androidx.preference s.Это привело к сбою одного из моих инструментальных тестов, и я не нашел разумного обходного пути для его прохождения.

В этом тесте у меня есть диалоговое окно, в котором отображается ошибка, если выполняется какое-либо условие в настройках приложения.В этом тесте конкретное предпочтение отключено.Пользователь может нажать на ошибку, чтобы открыть конкретное предпочтение, и таким образом войти и изменить его.Проблема в том, что я не могу понять, как утверждать, что отображается правильный PreferenceFragment.

Неудачные тесты выглядят так:

@Test
fun whenWorklistNotEnabled_shouldDisplayWorklistNotEnabledMessage() {
    val manager = PreferenceManagerImpl(InstrumentationRegistry.getInstrumentation().targetContext)
    whenever(preferenceManagerSpy.worklistEnabled).thenReturn(false)
    whenever(preferenceManagerSpy.openDicomSettings()).thenAnswer { manager.openWorklistSettings() }

    launchWorklistDialog()

    onView(withErrorMessageView(R.id.dialog_worklist_errorview))
        .check(
            matches(
                allOf(
                    isDisplayed(),
                    withPrimaryErrorText(R.string.global_worklist_disabled_error),
                    withSecondaryErrorText(R.string.dialog_worklist_worklist_disabled_error_secondary_text)
                )
            )
        )
        .perform(ErrorMessageViewActions.actionOnSecondaryTextContainer(click()))

    intended(
        allOf<Intent>(
            IntentMatchers.hasComponent(
                ComponentName(
                    InstrumentationRegistry.getInstrumentation().targetContext,
                    SettingsActivity::class.java
                )
            ),
            IntentMatchers.hasExtra(
                PreferenceActivity.EXTRA_SHOW_FRAGMENT,
                WorklistFragment::class.java
            )
        )
    )
}

Но как вы можете переписать его, чтобы он соответствовалопределенный PreferenceFragment, когда вы больше не используете реализацию PreferenceActivity?

1 Ответ

0 голосов
/ 27 сентября 2019

Нашел ответ, посмотрев на трассировку стека неудачного теста:

Recorded intents:
-Intent { cmp=com.example/.preferences.SettingsActivity (has extras) } handling packages:[[com.example]], extras:[Bundle[{EXTRA_SHOW_DICOM_FRAGMENT=class com.example.preferences.WorklistFragment}]])

Решение:

intended(
    allOf<Intent>(
        IntentMatchers.hasComponent(
            ComponentName(
                InstrumentationRegistry.getInstrumentation().targetContext,
                SettingsActivity::class.java
            )
        ),
        IntentMatchers.hasExtra(
            EXTRA_SHOW_WORKLIST_FRAGMENT,
            WorklistFragment::class.java
        )
    )
)
...