Проверьте TextView в каждом элементе RecyclerView с эспрессо - PullRequest
0 голосов
/ 16 мая 2019

Существует RecyclerView (R.id.recycler_view). Каждый элемент (R.id.movie_card) содержит два представления: ImageView и TextView (R.id.movie_title_text_view). Цель состоит в том, чтобы проверить с Espresso, что все элементы переработчика содержат не пустой текстовый вид. Пожалуйста, помогите правильно написать код.

Есть также использование Idle. Итак, момент начала тестирования RecyclerView правильный (после загрузки всех данных).

Не ясно, как сделать утверждение, что все R.id.movie_title_text_view не пусты. Полный метод испытаний следующий:

@Rule
public ActivityTestRule activityTestRule = new ActivityTestRule(MainActivity.class);

@Test
public void GridFragmentRecycleViewTest(){
    final int TESTED_VIEWHOLDERS_QUANTITY = 10;

    IdlingResource componentIdlingResource = getIdlingResource();
    Espresso.registerIdlingResources(componentIdlingResource);
    Log.d(TAG, "GridFragmentRecycleViewTest()");
    onView(withId(R.id.action_search)).perform(click());
    onView(isAssignableFrom(SearchView.class)).perform(typeSearchViewText("lord")).perform(pressKey(KeyEvent.KEYCODE_ENTER));
    EspressoIdlingResource.increment();
    onView(withId(R.id.recycler_view)).check(new RecyclerViewItemCountAssertion(TESTED_VIEWHOLDERS_QUANTITY));

    //up to here all works good
    onView(allOf(withId(R.id.movie_title_text_view))).check(matches(withText(not(isEmptyString()))));
}

public static ViewAction typeSearchViewText(final String text){
    return new ViewAction(){
        @Override
        public Matcher<View> getConstraints() {
            //Ensure that only apply if it is a SearchView and if it is visible.
            return allOf(isDisplayed(), isAssignableFrom(SearchView.class));
        }

        @Override
        public String getDescription() {
            return "Change view text";
        }

        @Override
        public void perform(UiController uiController, View view) {
            ((SearchView) view).setQuery(text,false);
        }


    };
}

Линия:

OnView (allOf (withId (R.id.movie_title_text_view))) проверить (матчи (withText (не (isEmptyString ()))));.

делает следующее исключение: androidx.test.espresso.AmbiguousViewMatcherException: '(с id: com.example.myapplication3: id / movie_title_text_view)' соответствует нескольким представлениям в иерархии. Виды проблем помечены как «**** MATCHES ****» ниже.

Просмотр иерархии: +> DecorView {id = -1, видимость = VISIBLE, ширина = 1440, высота = 2560, has-focus = true, has-focusable = true, has-window-focus = true, is-clickable = false, is-enabled = true, сфокусировано = false, is-focusable = false, is-layout-запрашивается = 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-запрашивается = false, has-input-connection = false, x = 0.0, y = 0.0, child-count = 3} ...

1 Ответ

0 голосов
/ 16 мая 2019

Это не готовый к использованию ответ, но если вы не получите других ответов, он, надеюсь, поможет вам направить вас в правильном направлении.

  1. Вам нужно полагаться на возможности RecyclerView для поиска держателей представлений и создаватьутверждение вокруг него (RecyclerView.ViewHolder holder = recyclerViewInstance.findViewHolderForAdapterPosition(index);)
  2. Найдите релевантное представление держателя вида, используя holder.itemView.findViewsWithText(listOfViews, text, FIND_VIEWS_WITH_TEXT); или, например, holder.itemView.findViewById(yourViewId);
  3. Выполните итерацию по имеющимся у вас элементам и выполните вышеуказанное для каждого элемента

Возможно, вы захотите построить утверждение вида для этой цели:

    public static ViewAssertion hasViewWithXyzAtPosition(final int index, final CharSequence text) {
        return new ViewAssertion() {
            @Override
            public void check(View view, NoMatchingViewException e) {
                if (!(view instanceof RecyclerView)) {
                    throw e;
                }
                RecyclerView rv = (RecyclerView) view;
                RecyclerView.ViewHolder holder = rv.findViewHolderForAdapterPosition(index);

                //...

                Assert.assertTrue(
                        "There's no view at index " + index + ",
                        ...
                );
            }
        };
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...