2016-07-21 6 views
16

पृष्ठभूमिपरीक्षण RxBinding RxSearchView

public Observable<List<Foo>> search(SearchView searchView) { 

    return RxSearchView.queryTextChanges(searchView) 
      .filter(charSequence -> !TextUtils.isEmpty(charSequence)) 
      .throttleLast(100, TimeUnit.MILLISECONDS) 
      .debounce(200, TimeUnit.MILLISECONDS) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(AndroidSchedulers.mainThread()) 
      .flatMap(this::performSearch) //Search the DB 
      .onErrorResumeNext(this::doSomething); 
} 

मैं उपरोक्त विधि AndroidJUnit4 धावक और Mocktio मदद से इसका परीक्षण करने की कोशिश कर रहा हूँ।

@Test 
public void testSearchCallsDataManager_WhenCalled() { 

    String input = "abc"; 

    when(mockSearchView.getQuery()).thenReturn(input); 

    searchRequestManager.search(mockSearchView).subscribe(testSubscriber); //Using standard TestSubscriber 

    testSubscriber.assertNoErrors(); 
    testSubscriber.assertNotCompleted(); 
    verify(mockDataManager).getFoos(input); 
} 

समस्या

मैं एक mockSearchView और एक वास्तविक SearchView उपयोग करने की कोशिश की है।

mockSearchView = mock(SearchView.class); 
searchView = new SearchView(InstrumentationRegistry.getContext(), null); 
searchView = new SearchView(InstrumentationRegistry.getTargetContext(), null); 

असली ऑब्जेक्ट्स के परिणामस्वरूप परीक्षण के दौरान विभिन्न अपवादों का परिणाम होता है। प्रतीत होता है कि नकली वस्तु का निष्पादन के दौरान कोई प्रभाव नहीं पड़ता है।

अद्यतन

स्पष्टता के लिए: आदर्श रूप में इसे अगर मैं SearchView नकली सकता है के रूप में मैं परीक्षण करने के लिए के बाद कुछ उत्सर्जित होता है कि क्या होता है और performSearch विधि सही जानकारी के साथ कहा जाता है कि चाहते हैं बहुत अच्छा होगा।

+0

आप इंस्ट्रूमेंटेशन रजिस्ट्री को कैसे चालू करते हैं? मैं आमतौर पर ऐसा कुछ करता हूं: @Rule सार्वजनिक गतिविधि टेस्टरूल <आपकी सक्रियता> mBaseActivity = new ActivityTestRule <> (YourActivity.class, true, true); और फिर आप SearchView searchView = new SearchView (mBaseActivity.getActivity()) कर सकते हैं; – rxDroid

उत्तर

1

आरएक्सबिंडिंग का परीक्षण करने के लिए मैंने बस एस्प्रेसो का उपयोग किया और debounce से 0 (सार्वजनिक स्थैतिक के रूप में समय पर बहस, और एस्प्रेसो setUp() विधि में इसे 0 तक सेट किया) सेट किया। तो बस

onView(withId(yourId)).perform(ViewActions.replaceText(to something)) 

और सिर्फ अपने Mockito या throttleLast() ऑपरेटर के साथ इसी तरह जो कुछ भी सत्यापित करें।

चीयर्स

+0

उत्तर के लिए धन्यवाद, यह उपयोगी है जब मैं बीडीडी में जाता हूं लेकिन परीक्षण JVM में चलता है यह जांचने के लिए कि SearchView का आउटपुट DataManager के माध्यम से एक खोज को ट्रिगर करता है। जवाब एस्प्रेसो परीक्षण के रूप में चलाने की आवश्यकता हो सकती है, लेकिन मुझे उम्मीद थी कि यह विशिष्ट परीक्षण JVM पर चल सकता है, क्योंकि मुझे वास्तव में इस बिंदु पर SearchView की परवाह नहीं है। –

+0

तो मॉकिटो शायद खोज दृश्य को नकल करने के लिए अच्छा विचार नहीं करेगा। PowerMockito या कुछ समान का उपयोग करने का प्रयास करें। लेकिन मुझे विश्वास है कि इसके चारों ओर जाने के लिए बहुत काम करना होगा, और सर्चव्यू यूआई है इसलिए इसे इंस्ट्रुमेंटेशन भाग में परीक्षण किया जाना चाहिए। और यदि आप कुछ उत्सर्जित करते समय परीक्षण करना चाहते हैं तो बस अपने कोड का परीक्षण करें खोज करें और करें कुछ और इंस्ट्रुमेंटेशन भाग में बस परीक्षण करें कि यह ट्रिगर किया गया है। जिस तरह से किया जाना चाहिए –

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