6

у меня есть три вида деятельности в моем приложенииAndroid Эспрессо функциональные тесты с фрагментами

  1. Войти активность
  2. Основной деятельность
  3. Детали деятельность

Я хочу использовать эспрессо, чтобы проверить последовательность событий: нажмите кнопку входа в систему для входа в систему, которая откроет основное действие, а затем щелкните элемент списка в основном действии, который откроет подробную активность, а затем нажмите другую кнопку в подробном действии. Я начал с создания простой тест, чтобы получить ссылку на ListView:

public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> { 

    public LoginActivityTest() { 
     super(LoginActivity.class); 
    } 

    @Override 
    public void setUp() throws Exception { 
     super.setUp(); 

     getActivity(); 
    } 

    public void testSequence() throws Exception { 
     // Login 
     onView(withId(R.id.button_log_in)).perform(click()); 

     // Check if MainActivity is loaded 
     onView(withId(R.id.container)).check(matches(isDisplayed())); 

     // Check if Fragment is loaded 
     onView(withId(R.id.list)).check(matches(isDisplayed())); 
    } 
} 

На mainActivityonCreate() метод я загружал фрагмент так:

getFragmentManager().beginTransaction() 
       .add(R.id.container, mListFragment) 
       .commit(); 

ListFragment фрагмент имеет (R.id.list), но все же испытание не выполнено с использованием NoMatchingViewException:

android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: com.tests.android.development:id/list 

Что я делаю неправильно?

+0

Вы нашли решение этого? – AdamMc331

+0

Если вы по-прежнему ищете помощь в этом, пожалуйста, покажите полный код 'onCreate()', который связан с этим вопросом. В частности, покажите декларацию и инициализацию для 'mListFragment'. Также покажите XML-макет для «ListFragment». –

ответ

1

Примечание от documentation для onView:

Примечание: вид должен быть частью иерархии представлений. Это может быть не случай, если он отображается как часть AdapterView (например, ListView). Если это так, используйте Espresso.onData, чтобы сначала загрузить представление.

Чтобы загрузить изображение onData, вам необходимо проверить наличие экземпляров любого вашего адаптера в списке. Другими словами, если ваш ListView использует адаптер Cursor, вы можете попробовать это:

onData(allOf(is(instanceOf(Cursor.class)))).check(matches(isDisplayed())); 

Важно отметить, что выше, будет проходить только если ваш ListView содержит, по меньшей мере, один элемент. Рекомендуется иметь один тест, в котором существует элемент, и один тест, в котором нет элемента.

Для получения дополнительной информации о том, как проверить данные, которые существуют, см. here.

Для получения дополнительной информации о том, как проверить данные, которых нет в адаптере, см. here.

+0

Никакое количество данных не будет помещать список в иерархию, о которой идет ошибка. Ваше руководство ценно, но только ** после ** устранена ошибка, за которую вы не указали никакой информации. – TWiStErRob

+0

Совет: 'onData (instanceOf (Cursor.class))' должен достичь того же запроса данных. 'allOf' не имеет смысла для одного совпадения, а' is' является избыточным по определению. Тем не менее, 'is' может иметь смысл, если он делает код более читаемым на английском языке: здесь он не из-за' allOf'. – TWiStErRob

0

В текущей версии (Espresso 2.2.2) это исключение всегда добавляется с помощью предложения View Hierarchy:, в котором перечислены все доступные для просмотра представления. Пройдитесь через это и проверьте, можете ли вы найти свой список.

В качестве альтернативы: выйдите из android-sdk\tools\uiautomatorviewer.bat (или .sh), которая берет снимок с текущего экрана и иерархии. Поместите контрольную точку в строку соответствия списка и проверьте, есть ли у нее список. Если вы найдете список, в тесте может возникнуть проблема синхронизации. Может быть, это не подождало достаточно, посмотрите больше о IdlingResource s.