2016-07-14 11 views
3

Ich schreibe UI-Tests für meine Anwendung mit Espresso. Ich würde gerne die Tatsache testen, dass wenn ich auf die Zurück-Schaltfläche klicke, während eine Serveranfrage läuft, die App dort bleiben muss, wo sie ist.Espressotest zurück, während AsyncTask ausgeführt wird

Es scheint nicht möglich zu sein, aufgrund der Espresso-Architektur, die die Ausführung der Tests warten lässt, wenn eine Hintergrundoperation (wie AsyncTask) ausgelöst wurde.

Also, wie kann ich das folgende Szenario testen:

  • Klick auf eine Schaltfläche, die ein AsyncTask
  • Test ausgelöst, dass, während die Aufgabe ausgeführt wird, und ich drücken Sie die Taste zurück, bleibt die App da?

Ist es möglich?

danke

Antwort

0

Sie die Anwendung von Triggern finish() verhindern kann, wenn die Zurück-Taste gedrückt wird. Um dies zu tun, überschreiben Sie einfach public void onBackPressed() ohne Aufruf super.onBackPressed(). Genau wie:

@Override 
public void onBackPressed() { 
    // super.onBackPressed(); 
} 

Wenn Sie darüber hinaus einen Dialog zeigen, während die Aufgabe ausgeführt wird, können Sie

myDialog.setCancelable(false); 
myDialog.setCanceledOnTouchOutside(false); 

verwenden Sie die Schaltfläche aus geschoben zu verhindern.

Grüße,

1

Das ist schwierig. Mit AsyncTasks können Sie Espresso nicht verwenden, während die Aufgaben ausgeführt werden. Und wenn Sie etwas anderes für die Hintergrundarbeit verwenden würden, wartet Espresso nicht und der Test endet vor dem Hintergrundjob.

Eine einfache Problemumgehung wäre, die Zurück-Taste ohne Espresso zu drücken, während die Aufgabe ausgeführt wird. Also, um die Aufgabe starten, rufen Activity.onBackPressed() und nachdem die Aufgabe beendet Espresso, um zu überprüfen, dass die Activity noch sichtbar ist:

// Start the async task  
onView(withId(R.id.start_task_button)).perform(click()); 

// Then "press" the back button (in the ui thread of the app under test) 
mActivityTestRule.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     mActivityTestRule.getActivity().onBackPressed(); 
    } 
}); 

// Then check that the Activity is still visible 
// (will be performed when the async task has finished) 
onView(withId(R.id.any_view_on_activity)).check(matches(isDisplayed())); 
+0

Hallo, ich bin die Automatisierung von diesem Test, so dass sie nicht von Hand ran und so kann ich nicht klicken manuell auf der Schaltfläche .. Und Aufruf von Activity.onBackPressed() nach dem Start der Aufgabe wird ein anderes Verhalten verursachen, weil es nach der Aufgabe ausgeführt wird, und wenn die Aufgabe beendet ist, ist das Verhalten der Schaltfläche zurück – Apperside

+0

Ich bin mir bewusst, dass die Tests sind automatisiert und Sie können nicht selbst klicken. Wenn Sie den Code aus meiner Antwort verwenden, wird 'onBackPressed()' ausgeführt, während 'AsyncTask' ausgeführt wird. Wenn die Task jedoch sofort oder kurz nach dem Start beendet wird, ist es möglich, dass onBackPressed() 'nach der Task aufgerufen wird. Hast du meine Lösung versucht? Was genau funktioniert nicht? – thaussma

+1

Ich habe es nicht Jet versucht, aber weil ich dachte, wenn die erste Anweisung Ihres Beispiels ausgeführt wird, stoppt die Ausführung der Tests dort und geht nur weiter, wenn die Aufgabe abgeschlossen ist. Wie auch immer, ich werde es versuchen – Apperside