2017-03-17 6 views
6

एस्प्रेसो वर्ग में:Espresso.pressBack() onBackPressed फोन नहीं करता है()

@Rule 
    public IntentsTestRule<MainActivity> mIntentsRule = new IntentsTestRule<>(
      MainActivity.class); 

@Test 
public void test_backButton(){ 
onView(withId(R.id.NEXT_ACTIVITY)).perform(scrollTo(), click()); 

Espresso.pressBack(); 
} 

गतिविधि में:

@Override 
public void onBackPressed() { 
    Log.d("TEST_pressBack", "inside onBackPressed()"); 
    do_something(); 
    super.onBackPressed(); 

} 
    @Override 
public void finish() { 
    Log.d("TEST_pressBack", "inside finish()"); 
    super.finish(); 

} 

जब मैं एस्प्रेसो परीक्षण विधि कॉल निष्पादन सीधे finish() को जाता है।

जब मैं Activity में बैक बटन (मेरे हाथ से) दबाता हूं तो निष्पादन पहले onBackPressed() और फिर finish() में चला जाता है। एस्प्रेसो के साथ फ़ंक्शन onBackPressed() का परीक्षण कैसे कर सकता हूं? धन्यवाद!

संपादित करें: यह मेरी त्रुटि है। समस्या यह थी कि गतिविधि में जिसमें मैं प्रेसबैक कॉल करना चाहता था ऑनस्क्रीन कीबोर्ड खोला गया था। जब सॉफ्ट कीबोर्ड खुलता है तो प्रेस-बटन बैकप्रेस पर कॉल नहीं करता है बल्कि इसके बजाय कीबोर्ड को प्रदर्शित नहीं करता है। मैं एक पंक्ति में दो pressBack() के साथ की कोशिश की और इसे सही ढंग से काम किया:

@Rule 
    public IntentsTestRule<MainActivity> mIntentsRule = new IntentsTestRule<>(
      MainActivity.class); 

@Test 
public void test_backButton(){ 
onView(withId(R.id.NEXT_ACTIVITY)).perform(scrollTo(), click()); 

Espresso.pressBack(); 

//The extra pressBack() 
Espresso.pressBack(); 

} 
+1

आप Espresso.closeSoftKeyboard() –

उत्तर

4

ऐसा लगता है कि अगर आप रूट गतिविधि में नहीं हैं की तरह Espresso.pressBack() विधि अभी जिस तरह तुम यह उम्मीद काम करता है।

/** 
    * Press on the back button. 
    * 
    * @throws PerformException if currently displayed activity is root activity, since pressing back 
    *   button would result in application closing. 
    */ 
    public static void pressBack() { 
     onView(isRoot()).perform(ViewActions.pressBack()); 
    } 

मैं इसे परीक्षण किया है और यह ठीक काम करता है अगर आप एक गतिविधि, जो आपके मूल गतिविधि नहीं है में यह कर रहे हैं: जब आप एक बार देख ले यह कार्यान्वयन टिप्पणी है पर। तुम वहाँ यह करने के लिए चाहते हैं, मेरा सुझाव है कि आप ui-स्वचालक बजाय का उपयोग करें (ui-स्वचालक एस्प्रेसो परीक्षण के अंदर पूरी तरह से प्रयोग करने योग्य है):

अपने Gradle को यह करें:

androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' 

और फिर ऐसा करने अपने परीक्षण में:

UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); 
mDevice.pressBack(); 
+1

का उपयोग कर सकते थे यह मेरी त्रुटि है। समस्या यह थी कि जिस गतिविधि पर मैं प्रेसबैक कॉल करना चाहता था, ऑनस्क्रीन कीबोर्ड खोला गया था। जब सॉफ्ट कीबोर्ड खुलता है तो प्रेस-बटन बैकप्रेस पर कॉल नहीं करता है बल्कि इसके बजाय कीबोर्ड को प्रदर्शित नहीं करता है। मैंने दो प्रेसबैक() के साथ प्रयास किया और यह सही ढंग से काम किया – billst

0

@billst तुम ठीक कह रहे, मैं भी नरम कीबोर्ड खुला के साथ एक ही समस्या थी, मैं अपनी टिप्पणी और बेहतर समाधान को पढ़ने के बाद डिबग बजाय वापस का उपयोग करने का) ViewAction.closeSoftKeyboard (उपयोग करने के लिए किया जाएगा दो बार दबाएं।

@Test 
public void afterStartedEditing_dialogDisplayed_when_home_or_back_pressed() { 
    //find view 
    onView(withId(R.id.add_pet_breed)) 
      .perform(click()) 
      .perform(closeSoftKeyboard()); 
    onView(isRoot()).perform(pressBack()); 

    //check assertion 
    onView(withText(R.string.discard)) 
      .check(matches(isDisplayed())); 
} 
संबंधित मुद्दे