2016-07-18 28 views
6

Problem: Mam problem podczas uruchamiania testu Espresso, po wywołaniu metody perform (click()) przy logowaniu przycisk, test nadal działa, ale nie przechodzi dalej, aż upłynie 45 sekund, a test automatycznie się nie powiedzie. Tymczasem logowanie odbywa się normalnie.Test ekspresu espresso utknął/nieaktywny po wykonaniu (kliknij()) przycisku w ViewAnimator

Kontekst: Mam działalność o dwa fragmenty obok siebie, fragment po prawej stronie obsługuje nazwę użytkownika i hasło EditTexts a także przycisk Login. Ten fragment zbudowany jest z ViewAnimator i dwóch liniowych widoków jako widoków dzieci, pierwszy LinearLayout ma elementy wspomniane wcześniej, a drugi ma inne rzeczy.

To jest to, co dzieje się na interfejsie, gdy przycisk logowania kliknął:

@Override 
public void setUILoggingIn() { 
    spinnerLogin.setVisibility(View.VISIBLE); 
    loginButton.setEnabled(false); 
    loginButton.setText(R.string.logging_in); 
    usernameText.setEnabled(false); 
    passwordText.setEnabled(false); 
} 

Po uwierzytelnieniu na serwerze, to w jaki sposób poradzić sobie z Ui:

@Override 
public void setUIAuthorized() { 
    new Handler(Looper.getMainLooper()).post(new Runnable() { 
     @Override 
     public void run() { 
      viewAnimator.showNext(); 
      // elements on the first child of the ViewAnimator 
      loginButton.setEnabled(true); 
      spinnerLogin.setVisibility(View.GONE); 

      // elements on the second child of the ViewAnimator 
      sendMessageButton.setEnabled(true); 
      chatInputText.setEnabled(true); 
     } 
    }); 
} 

Espresso test

ViewInteraction loginButton2 = onView(withId(R.id.login_button)); 
     loginButton2.perform(click());  // Test gets stuck here. 
     loginButton2.check(doesNotExist()); // Never reached. 

Czy ktoś wie, że jest gorący sly test na tego rodzaju scenariusz? Wystarczy wykryć, gdy zmieni się ViewAnimator, ale test utknie na kliknięciu.

również: To nie był początek testu, zanim pokazano kod przed, uruchomić ten test i działa jak marzenie:

ViewInteraction loginButton = onView(withId(R.id.login_button)); 

    /** Failed login **/ 

    loginButton.perform(click()); 

    ViewInteraction snackBarTextView = onView(
      allOf(withId(R.id.snackbar_text), withText("Login error"), isDisplayed())); 
    snackBarTextView.check(matches(withText("Login error"))); 

Dziękuję wszystkim za pomoc i poradę

Odpowiedz

6

Miałem podobny problem iw moim przypadku był to pasek postępu, który został załadowany na fragment, który nie był wyświetlany. Ten progressbar nie został przez pomyłkę odrzucony i blokował testy. Miałem taki sam wynik, gdy testy zakończyły się niepowodzeniem po 45 sekundach utknięcia zgodnie z opisem. Podsumowując, sprawdź, czy w wątku UI nie ma animacji jako paska postępu ani żadnego innego.

+0

Dziękuję za odpowiedź @jeprubio. Próbowałem usunąć okrągły pasek postępu z widoku, ale problem nadal występuje. Próbowałem też pracować z [Idling Resources] (https://www.youtube.com/watch?v=uCtzH0Rz5XU), ale nie mogę go uruchomić. Jakieś inne pomysły? –

+0

Rozwiązałem to! W tekście pojawiła się kolejna animacja. Jeszcze raz dziękuję za pomoc. –

0

Miałem ten sam problem podczas pracy z ListView.

Co ciekawe, zauważyłem, że test zostanie wznowiony, jeśli ręcznie spróbuję przewinąć ekran. Dodanie tej linii rozwiązało problem i wznowiło test.

onView(withId(R.id.myListView)).perform(swipeUp());