2011-11-03 14 views
15

Próbuję w końcu dodać testy interfejsu użytkownika do mojej aplikacji Android, aby zwiększyć zasięg (wszystkie moje pozostałe warstwy są poprawnie przetestowane, stąd wszystkie moje błędy pochodzą teraz z interfejsu użytkownika ...) Zacząłem używać ActivityInstrumentationTestCase2 jako moja klasa podstawowa do testów jednostkowych emulatora, a proste rzeczy są łatwe do sprawdzenia i działają przyjemnie.Testowanie systemu Android: jak sprawdzić okno dialogowe jest wyświetlane na ekranie? (używając ActivityInstrumentationTestCase2)

Ale teraz, próbuję sprawdzić okno dialogowe, pojawia się zgodnie z oczekiwaniami i nie wiem jak to zrobić.

Moje testy:

public void testOpensAboutDialogWhenAboutButtonClicked() { 
    final MyActivity activity = getActivity(); 
    final Instrumentation instrumentation = getInstrumentation(); 

    final Button aboutButton = (Button) activity.findViewById(R.id.about); 
    TouchUtils.clickView(this, aboutButton); 

    // how to test for the AboutDialog? 
} 

Teraz moja dialogowe nie posiada identyfikator, więc nie mogę uzyskać wskaźnik do niego za pomocą findViewById. Został stworzony przy użyciu konstruktora klasy dostępne:

final AlertDialog about = new AlertDialog.Builder(parent) 
      .setTitle(parent.getString(R.string.about_title)) 
      .setCancelable(true) 
      .setIcon(R.drawable.skull) 
      .... 

pomysłów lub wskaźniki do tutoriale?

EDIT: Aby odpowiedzieć Jens komentarz, jestem nie użyciu zarządzanych dialogi, po prostu tworząc AlertDialog i pokazano go z .Show()

+0

Czy korzystasz z zarządzanych okien dialogowych? – Jens

+0

@Jens, Właściwie nie jestem, nawet o nich nie wiedziałem ... Po prostu czytam o nich i to może pomóc w rozwiązaniu mojego problemu ... (To nauczy mnie omijać tutoriale ...) Spróbuję dziś wieczorem. Jeśli tak, proszę napisz odpowiedź, abym mógł dać ci nagrodę;) – Guillaume

+0

Mogę dać ci właściwą odpowiedź. – Jens

Odpowiedz

19

Ponieważ już używasz ActivityInstrumentationTestCase2 powinieneś zacząć używać Robotium - to uprości twoje testowanie dużo.

w Twoim przypadku jest to tak proste, jak to (jeśli wiesz oczekiwany tytuł lub coś innego niejasno unikalny o swoim oknie):

public void testSomeRandomSentence() { 
    Solo solo = new Solo(getInstrumentation(), getActivity()); 
    getInstrumentation().waitForIdleSync(); 
    // Now do whatever you need to do to trigger your dialog. 

    // Let's assume a properly lame dialog title. 
    assertTrue("Could not find the dialog!", solo.searchText("My Dialog Title")); 
} 
+0

Interesujące. Sprawdzę to. – Guillaume

+0

W porządku, to wygląda obiecująco, zdecydowanie droga do mnie. Gratulacje, wygrasz nagrodę! – Guillaume

+1

Nie działa to dla mnie, gdy używam Robotium. Myślę, że problemem mogło być to, że używałem starego okna dialogowego (w przeciwieństwie do 'DialogFragment') i jakoś to nie było połączone z hierarcy widoku w taki sam sposób, więc' solo.searchText (..) 'nie mógł znaleźć to. Naprawiłem to za pomocą 'DialogFragment' i używając Robotiums' solo.waitForFragmentByTag (...) 'metoda - która teraz działa świetnie :) – Dori

1

po przypisaniu identyfikatora Toast w Ustawienia() przez

toast = (Toast)activity.findViewById(..........); 

tworzyć testcase() {

ViewAsserts.assertOnScreen(toasts.getRootView(), toast.getRootView()); 
//pass if toast is visible on screen 

}

+0

Dzięki za odpowiedź, ale to nie jest toast, to AlertDialog, a cały punkt mojego pytania brzmiał, że nie ma id, więc nie mogę użyć findViewById, i nie mogę uzyskać odniesienia do w oknie dialogowym. – Guillaume

0

dodać getter do okna jak:

public AlertDialog get_aboutbox() 
{ 
    return this.about; 
} 

następnie tutaj rozwiązanie do testu:

public void testOpensAboutDialogWhenAboutButtonClicked() { 
    final MyActivity activity = getActivity(); 

    assertNotNull("aboutbox is null",activity.get_aboutbox()); 
    final Instrumentation instrumentation = getInstrumentation(); 

    final Button aboutButton = (Button) activity.findViewById(R.id.about); 
    TouchUtils.clickView(this, aboutButton); 

    assertTrue("About Button didn't displayed the Dlg", 
       activity.get_aboutbox().isShowing()); 
} 
Powiązane problemy