2017-03-17 28 views
6

W klasie Espresso:Espresso.pressBack() nie wymaga onBackPressed()

@Rule 
    public IntentsTestRule<MainActivity> mIntentsRule = new IntentsTestRule<>(
      MainActivity.class); 

@Test 
public void test_backButton(){ 
onView(withId(R.id.NEXT_ACTIVITY)).perform(scrollTo(), click()); 

Espresso.pressBack(); 
} 

W Aktywny:

@Override 
public void onBackPressed() { 
    Log.d("TEST_pressBack", "inside onBackPressed()"); 
    do_something(); 
    super.onBackPressed(); 

} 
    @Override 
public void finish() { 
    Log.d("TEST_pressBack", "inside finish()"); 
    super.finish(); 

} 

Kiedy wywołać metodę testową Espresso wykonanie idzie bezpośrednio do finish().

Po naciśnięciu przycisku wstecz (z moją ręką) w numerze Activity wykonanie odbywa się najpierw w onBackPressed(), a następnie pod numerem finish(). Jak mogę przetestować funkcję onBackPressed() za pomocą ekspresu espresso? Dzięki!

EDYTOWANIE: To jest mój błąd. Problem polegał na tym, że w Działaniu, w którym chciałem zadzwonić pressBack, otwarto klawiaturę ekranową. Gdy klawiatura jest otwarta, przycisk nie wywołuje funkcji BackPressed, ale powoduje, że klawiatura nie jest wyświetlana. Próbowałem z dwóch pressBack() z rzędu i to działało poprawnie:

@Rule 
    public IntentsTestRule<MainActivity> mIntentsRule = new IntentsTestRule<>(
      MainActivity.class); 

@Test 
public void test_backButton(){ 
onView(withId(R.id.NEXT_ACTIVITY)).perform(scrollTo(), click()); 

Espresso.pressBack(); 

//The extra pressBack() 
Espresso.pressBack(); 

} 
+1

Mogłeś użyć Espresso.closeSoftKeyboard() –

Odpowiedz

4

Wygląda na to metoda Espresso.pressBack() nie tylko działa tak można się spodziewać, jeśli nie jesteś w działalności korzeniowego. Gdy spojrzeć na to komentarz realizacja:

/** 
    * Press on the back button. 
    * 
    * @throws PerformException if currently displayed activity is root activity, since pressing back 
    *   button would result in application closing. 
    */ 
    public static void pressBack() { 
     onView(isRoot()).perform(ViewActions.pressBack()); 
    } 

Przetestowałem go i działa dobrze, jeśli robisz to działalność, która nie jest Twoja aktywność korzeni. Jeśli chcesz to zrobić tam, proponuję użyć UI-Automator zamiast (UI-automator doskonale nadające się wewnątrz testów espresso):

Dodaj to do swojej Gradle:

androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' 

A potem to zrobić w teście:

UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); 
mDevice.pressBack(); 
+1

To jest mój błąd. Problem polegał na tym, że w Działaniu, w którym chciałem zadzwonić pressBack, otwarto klawiaturę ekranową. Gdy klawiatura jest otwarta, przycisk nie wywołuje funkcji BackPressed, ale powoduje, że klawiatura nie jest wyświetlana. Próbowałem z dwoma pressBack() i działało poprawnie – billst

0

@billst masz rację, ja też miałem ten sam problem z klawiatura otwarte i pozbawione błędów po przeczytaniu Twojego komentarza i lepszym rozwiązaniem byłoby wykorzystanie ViewAction.closeSoftKeyboard() zamiast korzystania z powrotem naciśnij dwa razy.

@Test 
public void afterStartedEditing_dialogDisplayed_when_home_or_back_pressed() { 
    //find view 
    onView(withId(R.id.add_pet_breed)) 
      .perform(click()) 
      .perform(closeSoftKeyboard()); 
    onView(isRoot()).perform(pressBack()); 

    //check assertion 
    onView(withText(R.string.discard)) 
      .check(matches(isDisplayed())); 
}