2017-04-07 3 views
0

Wie kann ich Testfälle für den folgenden Code mit Espresso schreiben. Ich habe folgenden Code, der ausgeführt wird, wenn auf ein Symbol geklickt wird. Das weiß ich i die Einführung einer Absicht überprüfen Verwendung bestimmt sind (toPackage (.... möglicherweise auf Vorsatz spöttischen gestartet wenn via startActivityForResult gestartet aber wie diesen Fall zu behandeln.Testen mit Espresso

try { 
intent = new Intent(Intent.ACTION_DIAL); 
intent.setData(Uri.parse("tel:" +"xxxxxx"); // 12 digit mobile no 
    if (intent.resolveActivity(context.getPackageManager()) != null) { 
         startActivity(intent) 
     } 
    } 
catch (Exception e) { 
    Toast.makeText(getActivity(), "No phone number available", Toast.LENGTH_SHORT).show(); 
       } 

Antwort

2

Ein Antwort ist die ‚bestimmt‘ Methode nach dem Test-Code zu verwenden, um zu überprüfen, dass die Aktivität Resultat für Ihre Anforderungen erfüllt, die wie folgt aussieht:.

@Test 
public void typeNumber_ValidInput_InitiatesCall() { 
    // Types a phone number into the dialer edit text field and presses the call button. 
    onView(withId(R.id.edit_text_caller_number)) 
      .perform(typeText(VALID_PHONE_NUMBER), closeSoftKeyboard()); 
    onView(withId(R.id.button_call_number)).perform(click()); 

    // Verify that an intent to the dialer was sent with the correct action, phone 
    // number and package. Think of Intents intended API as the equivalent to Mockito's verify. 
    intended(allOf(
      hasAction(Intent.ACTION_CALL), 
      hasData(INTENT_DATA_PHONE_NUMBER), 
      toPackage(PACKAGE_ANDROID_DIALER))); 
} 

jedoch als Teil eines vollautomatischen Tests, müssen Sie auf Geben Sie auch die Antwort auf die Aktivität aus, so dass sie ausgeführt werden kann, ohne dass die Benutzereingabe blockiert werden muss t Anstoßen vor dem Ausführen von Tests:

@Before 
    public void stubAllExternalIntents() { 
     // By default Espresso Intents does not stub any Intents. Stubbing needs to be setup before 
     // every test run. In this case all external Intents will be blocked. 
     intending(not(isInternal())).respondWith(new ActivityResult(Activity.RESULT_OK, null)); 
    } 

Dann können Sie den entsprechenden Teil des Tests wie folgt schreiben:

@Test 
    public void pickContactButton_click_SelectsPhoneNumber() { 
     // Stub all Intents to ContactsActivity to return VALID_PHONE_NUMBER. Note that the Activity 
     // is never launched and result is stubbed. 
     intending(hasComponent(hasShortClassName(".ContactsActivity"))) 
       .respondWith(new ActivityResult(Activity.RESULT_OK, 
         ContactsActivity.createResultData(VALID_PHONE_NUMBER))); 

     // Click the pick contact button. 
     onView(withId(R.id.button_pick_contact)).perform(click()); 

     // Check that the number is displayed in the UI. 
     onView(withId(R.id.edit_text_caller_number)) 
       .check(matches(withText(VALID_PHONE_NUMBER))); 
    } 

Wenn Sie aus einer anderen Anwendung mit den tatsächlichen Benutzereingabe überprüfen müssen (wie die Wählhilfe), das liegt außerhalb des Geltungsbereichs von Espresso. Da ich derzeit mit einem Anbieter arbeite, der bei solchen Fällen hilft, zögere ich, Namen und Tools zu nennen, aber viele Leute müssen Tests schreiben, die die echte End-to-End-Erfahrung simulieren.

Mike Evans hat eine große schreiben über Test-Intents here und es gibt immer die Android-Dokumentation here.

+0

Ich schätze Ihre Antwort wirklich, aber ich suchte nach einer Lösung für das Problem, wo wir die Dialer-Aktivität starten StartActivity und nicht startActivityForResult. Ich hätte die ähnliche Strategie verwendet, wie Sie es für die Verspottung der Kamera-Absicht erwähnt haben – cammando

Verwandte Themen