2016-08-19 2 views
0

Я пишу тест эспрессо, который проверяет, не удается найти TextView в FooterView, который я программно добавил в ListView. Единственный способ найти TextView в тесте эспрессо - это подождать за 1 секунду перед проверкой наличия этого TextView.FooterView в ListView не найден с использованием Espresso

// checks if the list view contains an issue that has the text "Do" somewhere 
    onView(withId(R.id.listView)).check(matches(hasDescendant(withText(containsString("Do"))))); 
    // swipes down to access the load older issues button 
    onView(allOf(withId(R.id.mainLayout))).perform(swipeUp()); 

    // View listView = shelfActivity.getActivity().findViewById(R.id.listView_footer_textview); // returns the view, even when espresso tells that it does not exist 
    // Thread.sleep(1000); // need to wait in order to find the footerview of the list view 

    // check if the load older issues button is here 
    onView(allOf(withId(R.id.listView_footer_textview), isDisplayed())).check(matches(isDisplayed())); 

Это TextView внутри FooterView фактически существующих, и я могу найти его в тесте на том же самом месте, если я стараюсь, чтобы получить его с помощью метода нормального findById(), но не найти его, когда я проверить это с эспрессо.

Так что мой вопрос: Мне действительно нужно вызвать Thread.sleep (1000), чтобы пройти тест, если я хочу проверить TextView внутри FooterView. Для меня большое преимущество эспрессо заключается в том, что мне не нужно иметь дело с ожиданием до тех пор, пока представление не будет готово, так что нет ли существующей функции эспрессо, которая делает это автоматически?

ответ

0

FooterView ListViewonData метод.

Адрес official documents.

Например:

public static final String FOOTER = "FOOTER"; 
... 
View footerView = layoutInflater.inflate(R.layout.list_item, listView, false); 
((TextView) footerView.findViewById(R.id.item_content)).setText("count:"); 
((TextView) footerView.findViewById(R.id.item_size)).setText(String.valueOf(data.size())); 
listView.addFooterView(footerView, FOOTER, true); 

Затем вы можете написать Сличитель, соответствующий этому объекту:

import static org.hamcrest.Matchers.allOf; 
import static org.hamcrest.Matchers.instanceOf; 
import static org.hamcrest.Matchers.is; 

@SuppressWarnings("unchecked") 
public static Matcher<Object> isFooter() { 
    return allOf(is(instanceOf(String.class)), is(LongListActivity.FOOTER)); 
} 

И загружая вид в тесте тривиальна:

import static com.google.android.apps.common.testing.ui.espresso.Espresso.onData; 
import static com.google.android.apps.common.testing.ui.espresso.action.ViewActions.click; 
import static com.google.android.apps.common.testing.ui.espresso.sample.LongListMatchers.isFooter; 

public void testClickFooter() { 
    onData(isFooter()) 
    .perform(click()); 
    ... 
} 
+0

Это не проблемы, которые я никогда не nd textview внутри моего представления нижнего колонтитула, проблема в том, что я нахожу его только после того, как я позволю протектору спать хотя бы на 1 секунду. такая же проблема остается, если я добавлю критерии (LongListActivity.FOOTER) к моему поиску (что на самом деле не нужно, так как поиск идентификатора должен быть достаточным). Как упоминалось выше, эта проблема также не возникает, когда я ищу одно и то же текстовое представление с полкойActivity.getActivity(). FindViewById(); в этом случае я нахожу ожидаемый текст сразу, без необходимости спать в течение 1 секунды. – richard

+0

Я не могу понять проблему, так как 'но не удается найти FooterView', и' никогда не находить текстовое представление внутри моего нижнего колонтитула 'в комментарии выше. 'R.id.listView_footer' является идентификатором TextView? – nshmura

+0

Извините, описание было не столь ясным, я отредактировал его сейчас. он не может найти текстовое представление внутри представления нижнего колонтитула, если я не вызываю sleep (1000) перед проверкой. – richard