2015-06-17 4 views
10

Я делаю тестирование переходной активности с Espresso, но я не знаю, если это лучший способ сделать это:Есть ли способ узнать, было ли запущено действие с Espresso?

public void testStartLogin() { 
    onView(withId(R.id.register)).perform(click()); 
    onView(withId(R.id.login_password)).check(matches(isDisplayed())); 
    onView(withId(R.id.login_show_password)).check(matches(isDisplayed())); 
} 

Последних два из второй активности, но это выглядит ужасно для меня. Есть ли другой способ?

ответ

14

Утверждение чего-то против представления, относящегося к определенной деятельности, на мой взгляд очень элегантный способ проверить, была ли эта конкретная деятельность запущена. Из официальных документов:

В то же время, структура предотвращает прямой доступ к деятельности и виду приложения, поскольку проведение на эти объекты и работающие на них от потока пользовательского интерфейса является основным источником тестовой слоистости. Таким образом, вы не увидите таких методов, как getView и getCurrentActivity в Espresso API.

Однако, есть способ сделать то, что вам нужно, как показано на рисунке here. В моей версии я также определил метод утверждения, например:

public void assertCurrentActivityIsInstanceOf(Class<? extends Activity> activityClass) { 
    Activity currentActivity = getActivityInstance(); 
    checkNotNull(currentActivity); 
    checkNotNull(activityClass); 
    assertTrue(currentActivity.getClass().isAssignableFrom(activityClass)); 
} 

, который я использовал в методах испытаний.

Для моих собственных тестов у меня не было никаких проблем с его использованием (Espresso 2.0!), Но это сделало его несколько лишним, так как я все равно проверю виды, принадлежащие этому действию. Так оно работает, но я бы не рекомендовал его.

Удачи вам!

EDIT:

Существует также возможность проверки, если цель была отправлена ​​из вашей первой активности на второй (проверить this short tutorial), но это не обязательно означает, что вторая активность, проявляемая все его взглядов правильно. Вы должны по-прежнему проверять их отображение, которое возвращает вас туда, где вы начали.

8

Авторы эспрессо препятствуют доступу к фактической деятельности для определения состояния приложения.

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

Однако эспрессо поставляется с ActivityLifecycleMonitor, который отслеживает состояния видов деятельности. Вы можете получить доступ к нему и выполнить вы утверждению так же, как это:

final Activity[] activity = new Activity[1]; 

InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { 
     @Override 
     public void run() { 
      activity[0] =Iterables.getOnlyElement(ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED)); 
} 

assertTrue(activity instanceof MyActivity.class); 

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

5

Этот короткий фрагмент должен работать:

intended(hasComponent(ExpectedActivity.class.getName())); 
Смежные вопросы