2014-09-23 12 views
29

Oto jeden z moich przypadków testowych Espresso.Espresso - Jak mogę sprawdzić, czy działanie zostało uruchomione po wykonaniu określonej czynności?

public void testLoginAttempt() { 
     Espresso.onView(ViewMatchers.withId(R.id.username)).perform(ViewActions.clearText()).perform(ViewActions.typeText("[email protected]")); 
     Espresso.onView(ViewMatchers.withId(R.id.username)).perform(ViewActions.clearText()).perform(ViewActions.typeText("invalidpassword")); 

     Espresso.onView(ViewMatchers.withId(R.id.login_button)).perform(ViewActions.click()); 
     // AFTER CLICKING THE BUTTON, A NEW ACTIVITY WILL POP UP. 
     // Clicking launches a new activity that shows the text entered above. You don't need to do 
     // anything special to handle the activity transitions. Espresso takes care of waiting for the 
     // new activity to be resumed and its view hierarchy to be laid out. 
     Espresso.onView(ViewMatchers.withId(R.id.action_logout)) 
       .check(ViewAssertions.matches(not(ViewMatchers.isDisplayed()))); 

    } 

Obecnie to, co zrobiłem, to sprawdzenie, czy widok w nowym działaniu (R.id.action_logout) jest widoczny, czy nie. Jeśli jest widoczny, zakładam, że aktywność została pomyślnie otwarta. Ale to nie działa tak, jak się spodziewałem. Czy istnieje lepszy sposób sprawdzenia, czy nowa aktywność została pomyślnie uruchomiona, zamiast sprawdzać widok w tej aktywności jest widoczny? Dzięki

+0

Dlaczego nie można importować ViewMatchers?'import static android.support.test.espresso.matcher.ViewMatchers. *' – Roel

+0

@ user2062024 Czy możesz opublikować działający kod? –

+0

Najnowsze espresso automatycznie czeka na Asyntask. – WenChao

Odpowiedz

6

Problem polega na tym, że aplikacja wykonuje operację sieciową po kliknięciu przycisku logowania. Espresso nie obsługuje (przerywa) połączeń sieciowych, aby zakończyć domyślnie. Musisz zaimplementować swój własny IdlingResource, który zablokuje Espresso przed kontynuowaniem testów, dopóki IdlingResource nie wróci do stanu bezczynności, co oznacza, że ​​żądanie sieciowe zostało zakończone. Spójrz na espresso stronie samples - https://google.github.io/android-testing-support-library/samples/index.html

+0

Zaktualizowano przestarzały link – denys

7

spróbuj

intended(hasComponent(new ComponentName(getTargetContext(), ExpectedActivity.class))); 

Spójrz na response from @riwnodennyk

+1

Dlaczego wymagana jest 'nowa nazwa komponentu'? –

35

Można użyć:

intended(hasComponent(YourExpectedActivity.class.getName())); 

Wymaga to Gradle wpis:

androidTestCompile ("com.android.support.test.espresso:espresso-intents:$espressoVersion") 

import do intended() i hasComponent()

import static android.support.test.espresso.intent.Intents.intended; 
import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent; 
-3
@RunWith(RobolectricTestRunner.class) 
public class WelcomeActivityTest { 

    @Test 
    public void clickingLogin_shouldStartLoginActivity() { 
     WelcomeActivity activity = Robolectric.setupActivity(WelcomeActivity.class); 
     activity.findViewById(R.id.login).performClick(); 

     Intent expectedIntent = new Intent(activity, LoginActivity.class); 
     assertThat(shadowOf(activity).getNextStartedActivity()).isEqualTo(expectedIntent); 
    } 
} 
+1

Pytanie dotyczy Espresso, nie Robolectric. – Allison

3

Można to zrobić w następujący sposób:

@Test 
public void testLoginAttempt() { 
    Espresso.onView(ViewMatchers.withId(R.id.username)).perform(ViewActions.clearText()).perform(ViewActions.typeText("[email protected]")); 
    Espresso.onView(ViewMatchers.withId(R.id.username)).perform(ViewActions.clearText()).perform(ViewActions.typeText("invalidpassword")); 

    Intents.init(); 
    Espresso.onView(ViewMatchers.withId(R.id.login_button)).perform(ViewActions.click()); 
    Intents.release(); 
} 

java.lang.NullPointerException zostaje wyrzucony jeśli Intents.init() nie nazywa.

0

Upewnij się, że intencją biblioteka Expresso jest w Gradle zależności

androidTestImplementation "com.android.support.test.espresso:espresso-intents:3.0.1" 

następnie zaimportować te dwa w pliku testowego

import android.support.test.espresso.intent.Intents.intended 
import android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent 

Następnie dodać IntentsTestRule w swojej klasie testowej

@Rule 
@JvmField 
val mainActivityRule = IntentsTestRule(MainActivity::class.java) 

Na koniec sprawdź, czy aktywność została rozpoczęta

@Test 
fun launchActivityTest() { 
    onView(ViewMatchers.withId(R.id.nav_wonderful_activity)) 
      .perform(click()) 

    intended(hasComponent(WonderfulActivity::class.java!!.getName())) 
} 
3

Spróbuj:

intended(hasComponent(YourActivity.class.getName()));

Również pamiętać

java.lang.NullPointerException zostaje wyrzucony jeśli Intents.init() nie jest wywoływana przed intended()