2016-02-18 13 views
10

का उपयोग कर एक टुकड़े का परीक्षण कैसे करें मेरे पास एक एंड्रॉइड खंड है जिसे मैं परीक्षण करना चाहता हूं। मैंने एक परीक्षण गतिविधि बनाई जिसमें मैं इस खंड को जोड़ता हूं और कुछ एस्प्रेसो परीक्षण चलाता हूं।एस्प्रेसो

हालांकि, एस्प्रेसो को टुकड़े के अंदर कोई भी विचार नहीं मिला है। यह दृश्य पदानुक्रम को डंप करता है और यह सब खाली है।

मैं वास्तविक मूल गतिविधि का उपयोग नहीं करना चाहता हूं। मैं अलगाव में इस टुकड़े का परीक्षण करना चाहता हूं। क्या किसी ने ऐसा किया है? क्या कोई नमूना है जिसमें एक समान कोड है?

@RunWith(AndroidJUnit4.class) 
class MyFragmentTest { 
    @Rule 
    public ActivityTestRule activityRule = new ActivityTestRule<>(
    TestActivity.class); 

    @Test 
    public void testView() { 
     MyFragment myFragment = startMyFragment(); 
     myFragment.onEvent(new MyEvent()); 
     // MyFragment has a recyclerview. 
     //OnEvent is EventBus callback that in this test contains no data. 
     //I want the fragment to display empty list text and hide the recyclerView 
     onView(withId(R.id.my_empty_text)).check(matches(isDisplayed())); 
     onView(withId(R.id.my_recycler)).check(doesNotExist())); 
    } 

    private MyFragment startMyFragment() { 
     FragmentActivity activity = (FragmentActivity) activityRule.getActivity(); 
    FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction(); 
    MyFragment myFragment = new MyFragment(); 
    transaction.add(myFragment, "myfrag"); 
    transaction.commit(); 
    return myFragment; 
    } 
} 
+0

क्या आपने इसके लिए कोई वेब खोज करने का प्रयास किया था? मुझे बहुत सारे उदाहरण मिलते हैं। –

+0

हमें अपना कोड दिखाने के लिए हमेशा एक अच्छा विचार है। – Emzor

+1

मैंने नेट पर खोजने की कोशिश की। मैं कोई उदाहरण नहीं ढूंढ पाया है। @DougStevenson, अगर आप जो पाते हैं उसे साझा कर सकते हैं तो मैं इसकी सराहना करता हूं। – greenrobo

उत्तर

0

आप शायद दृश्य पदानुक्रम में खंड को इंजेक्ट करना भूल गए हैं। TestActivity लेआउट (FrameLayout आईडी fragment_container) के साथ धारक कंटेनर को अपने टुकड़े के लिए परिभाषित करने का प्रयास करें और फिर add(myFragment, "tag") के बजाय, add(R.id.fragment_container, myFragment, "tag") (this method) का उपयोग करें। मुझे लगता है कि आप उसी हस्ताक्षर के साथ replace विधि का भी उपयोग कर सकते हैं।

+0

मैंने इस विधि को आजमाया (ऐड (आईडी, खंड, टैग) का उपयोग करके) लेकिन इससे मदद नहीं मिली। मुझे संदेह है कि यह एकाधिक धागे पर बातचीत के कारण है। Espresso किसी भी तरह यह पसंद नहीं है। – greenrobo

4

मैं निम्नलिखित तरीके इस प्रकार एक ViewAction बनाएं में क्या होगा:

public static ViewAction doTaskInUIThread(final Runnable r) { 
    return new ViewAction() { 
     @Override 
     public Matcher<View> getConstraints() { 
      return isRoot(); 
     } 

     @Override 
     public String getDescription() { 
      return null; 
     } 

     @Override 
     public void perform(UiController uiController, View view) { 
      r.run(); 
     } 
    }; 
} 

तो कोड है जो यूआई धागा

onView(isRoot()).perform(doTaskInUIThread(new Runnable() { 
     @Override 
     public void run() { 
      //Code to add your fragment or anytask that you want to do from UI Thread 
     } 
    })); 
नीचे

में चला जाना चाहिए शुरू करने के लिए नीचे दिए गए का उपयोग परीक्षण का एक उदाहरण है मामले में खंड दृश्य पदानुक्रम

@Test 
public void testSelectionOfTagsAndOpenOtherPage() throws Exception{ 

    Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      //Task that need to be done in UI Thread (below I am adding a fragment) 

     } 
    }; 
    onView(isRoot()).perform(doTaskInUIThread(r)); 

} 
2
public class VoiceFullScreenTest { 
    @Rule 
    public ActivityTestRule activityRule = new ActivityTestRule<>(
      TestActivity.class); 

    @Test 
    public void fragment_can_be_instantiated() { 
     activityRule.getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       VoiceFragment voiceFragment = startVoiceFragment(); 
      } 
     }); 
     // Then use Espresso to test the Fragment 
     onView(withId(R.id.iv_record_image)).check(matches(isDisplayed())); 
    } 

    private VoiceFragment startVoiceFragment() { 
     TestActivity activity = (TestActivity) activityRule.getActivity(); 
     FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction(); 
     VoiceFragment voiceFragment = new VoiceFragment(); 
     transaction.add(voiceFragment, "voiceFragment"); 
     transaction.commit(); 
     return voiceFragment; 
    } 


} 

ऊपर उल्लिखित यूआई थ्रेड से आप अपना टुकड़ा शुरू कर सकते हैं।

0

आप FragmentTestRule का उपयोग कर सकते हैं।

नियमित ActivityTestRule आप का उपयोग करना चाहिए के बजाय

:

@Rule 
public FragmentTestRule<?, FragmentWithoutActivityDependency> fragmentTestRule = 
    FragmentTestRule.create(FragmentWithoutActivityDependency.class); 

आप more details in this blog post पा सकते हैं।

संबंधित मुद्दे