রোবলেক্ট্রিকের সাথে ভিউপ্যাজার (এবং কার্সরলডার) পরীক্ষা করা হচ্ছে


91

রোব ইলেক্ট্রিক ব্যবহার করে নীচের সেটআপটি কীভাবে পরীক্ষা করতে হয় কেউ জানেন?

ভিউপ্যাজারযুক্ত খণ্ড, কার্সরলডার দিয়ে লোড হওয়া ডেটা।

নীচের কোড সহ, কার্সরলডার ভিউ পেজারের জন্য অ্যাডাপ্টারে কখনই ধাক্কা দেয় না। আমি await()ডাকে আটকে যাই ।

ইভেন্টস ফ্রেমমেন্টটেষ্ট.জভা:

@RunWith(CustomRobolectricTestRunner.class)
public class EventsFragmentTest extends AbstractDbAndUiDriver
{
    // which element in the view pager we are testing
    private static final int           TEST_INDEX = 0;

    protected SherlockFragmentActivity mActivity;
    protected EventsFragment_          mFragment;

    @Override
    @Before
    public void setUp() throws Exception
    {
        // create activity to hold the fragment
        this.mActivity = CustomRobolectricTestRunner.getActivity();

        // create and start the fragment
        this.mFragment = new EventsFragment_();
    }

    @Test
    public void sanityTest()
    {
        // create an event
        final Event event = this.createEvent();

        // create mock cursor loader
        final Cursor cursor = this.createMockEventCursor(event);
        this.mFragment.setCursorLoader(mock(CursorLoader.class));
        when(this.mFragment.getCursorLoader().loadInBackground()).thenReturn(cursor);
        CustomRobolectricTestRunner.startFragment(this.mActivity, this.mFragment);

        await().atMost(5, SECONDS).until(this.isCursorLoaderLoaded(), equalTo(true));

        // check for data displayed
        final TextView title = this.getTextView(R.id.event_view_title);
        final TextView text = this.getTextView(R.id.event_view_text);

        // exists and visible is enough for now
        this.getImageView(R.id.event_view_image);

        assertThat(title.getText().toString(), equalTo(event.getTitle()));
        assertThat(text.getText().toString(), is(event.getText()));

        // clean up
        cursor.close();
    }

    @Override
    protected View getRootView()
    {
        return ((ViewPager) this.mFragment.getView().findViewById(R.id.events_pager)).getChildAt(TEST_INDEX);
    }

    private Callable<Boolean> isCursorLoaderLoaded()
    {
        return new Callable<Boolean>()
        {
            public Boolean call() throws Exception
            {
                return EventsFragmentTest.this.mFragment.isCursorLoaderLoaded(); // The condition that must be fulfilled
            }
        };
    }

    /**
     * Create an event
     * 
     * @return
     */
    protected Event createEvent()
    {
        // create a random event
        final Event event = new Event();
        event.setImage(null);
        event.setLink("/some/link/" + RandomUtils.getRandomString(5)); //$NON-NLS-1$
        event.setResourceUri("/rest/uri/" + RandomUtils.getRandomDouble()); //$NON-NLS-1$
        event.setText("this is a test object " + RandomUtils.getRandomString(5)); //$NON-NLS-1$
        return event;
    }

    protected Cursor createMockEventCursor(final Event event)
    {
        // Create a mock cursor.
        final Cursor cursor = new CursorWrapper(mock(MockCursor.class));

        when(cursor.getCount()).thenReturn(1);
        when(cursor.getString(cursor.getColumnIndexOrThrow(EventTable.COLUMN_TEXT))).thenReturn(event.getText());
        when(cursor.getString(cursor.getColumnIndexOrThrow(EventTable.COLUMN_TITLE))).thenReturn(event.getTitle());
        when(cursor.getString(cursor.getColumnIndexOrThrow(EventTable.COLUMN_IMAGE))).thenReturn(event.getImage());
        when(cursor.getString(cursor.getColumnIndexOrThrow(EventTable.COLUMN_LINK))).thenReturn(event.getLink());
        when(cursor.getString(cursor.getColumnIndexOrThrow(EventTable.COLUMN_RESOURCE_URI))).thenReturn(
                        event.getResourceUri());

        // return created event
        return cursor;
    }

}

ইভেন্টস ফ্রেমমেন্ট.জভা

@EFragment(resName = "events_fragment")
public class EventsFragment extends SherlockFragment implements LoaderCallbacks<Cursor>
{
    @ViewById(R.id.events_pager)
    protected ViewPager             mPager;

    @ViewById(R.id.events_indicator)
    protected CirclePageIndicator   mIndicator;

    @Pref
    protected ISharedPrefs_         mPreferences;

    protected EventsFragmentAdapter pageAdapter;

    private CursorLoader            mCursorLoader;

    /**
     * initialise the cursoradapter and the cursor loader manager.
     */
    @AfterViews
    void init()
    {
        final SherlockFragmentActivity activity = this.getSherlockActivity();

        this.pageAdapter = new EventsFragmentAdapter(activity.getSupportFragmentManager(), null);
        this.mPager.setAdapter(this.pageAdapter);
        this.mIndicator.setViewPager(this.mPager);
        this.getLoaderManager().initLoader(this.mPager.getId(), null, this);
    }

    /* (non-Javadoc)
     * @see android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader(int, android.os.Bundle)
     */
    @Override
    public Loader<Cursor> onCreateLoader(final int arg0, final Bundle arg1)
    {
        if (this.mCursorLoader == null)
        {
            // set sort to newest first
            final String sortOrder = BaseColumns._ID + " DESC"; //$NON-NLS-1$

            this.mCursorLoader = new CursorLoader(this.getActivity(), EventContentProvider.CONTENT_URI,
                            EventTable.getProjection(), AbstractDbTable.getWhereCondition(null),
                            AbstractDbTable.getWhereArgs(this.mPreferences, null), sortOrder);
        }
        return this.mCursorLoader;
    }

    /* (non-Javadoc)
     * @see android.support.v4.app.LoaderManager.LoaderCallbacks#onLoadFinished(android.support.v4.content.Loader, java.lang.Object)
     */
    @Override
    public void onLoadFinished(final Loader<Cursor> arg0, final Cursor cursor)
    {
        this.pageAdapter.swapCursor(cursor);

    }

    /* (non-Javadoc)
     * @see android.support.v4.app.LoaderManager.LoaderCallbacks#onLoaderReset(android.support.v4.content.Loader)
     */
    @Override
    public void onLoaderReset(final Loader<Cursor> arg0)
    {
        this.pageAdapter.swapCursor(null);
    }

    /**
     * Required for testing only.
     * 
     * @param cursorLoader
     */
    public void setCursorLoader(final CursorLoader cursorLoader)
    {
        this.mCursorLoader = cursorLoader;
    }

    /**
     * Required for testing only.
     * 
     * @param cursorLoader
     */
    public CursorLoader getCursorLoader()
    {
        return this.mCursorLoader;
    }

    public boolean isCursorLoaderLoaded()
    {
        return (this.pageAdapter.getCursor() != null);
    }
}

6
দেখে মনে হচ্ছে আপনি ইউনিট পরীক্ষার চেয়ে সিস্টেম টেস্টের আরও লেখার চেষ্টা করছেন, এটি কি সঠিক অনুমান? যদি তাই হয় তবে এটি রোবটিয়াম বা এসপ্রেসো দিয়ে আরও সহজ করা যায়। আপনি যখন ইউনিট বা ইন্টিগ্রেশন পরীক্ষার জন্য অ্যান্ড্রয়েডের নির্দিষ্ট উল্লেখ রয়েছে তবে ব্যবহারকারী কী দেখতে পাবে তা পরীক্ষা করে নিচ্ছেন না এমন সময় আপনি যখন রোবলেট্রিকটি সত্যিই সহায়ক।
এলিয়ট

আমি কিছুটা কথা বলতে মিস করলাম, রোবলেট্রিক আপনাকে ব্যবহারকারী কী দেখছে তা পরীক্ষা করতে সহায়তা করার চেষ্টা করছে। আমি মনে করি আপনি যে সমস্যার সমাধান করতে যাচ্ছেন তা হ'ল আপনাকে প্রচুর পরিমাণে বুট স্ট্র্যাপিং কোড লিখতে হবে যা সম্ভবত উত্পাদনের সঠিক কোডের পথটি পরীক্ষা করবে না এবং সময়োত্তর অপেক্ষারত ব্যবহার করার চেষ্টা করবে যা সাধারণত পরীক্ষার ভঙ্গুর হয় কারণ সেখানে বলার উপায় নেই দীর্ঘ async কাজ গ্রহণ করবে।
ইলিয়ট

আমি দ্রুত পরীক্ষা নেওয়ার চেষ্টা করছি। আমি এবং প্রায়শই রোবটিয়ামে পরীক্ষা লিখতে পারি তবে সেগুলি রোবলেট্রিকের তুলনায় ধীরে ধীরে ধীর হয়। আমার জন্য একটি আদর্শ জগতের 2 সেট পরীক্ষার সেটআপ, সমর্থন এবং রক্ষণাবেক্ষণ করা হবে না। এই এখানে আমার উদ্দেশ্য ছিল।
কোরি স্কট

4
শুধু একটি চিন্তা, Robolectric.runBackgroundTasks();কোন ভাল - সম্ভবত পরিবর্তেawait
Weston

4
আমি @ এলিওট এর সাথে একমত হয়েছি আপনি ইউনিট পরীক্ষার মতো ইন্টিগ্রেশন টেস্ট বা দৃশ্যাবলী পরীক্ষা তৈরির চেষ্টা করছেন এবং যদি আপনি হ্যাক করতে চান \ অপব্যবহার রোবलेक्ट্রিক জরিমানা, তবে এর দাম আছে। রোবোলেট্রিক কেবল ক্লাস নয়, স্টাব সরবরাহ করে।
কোডসক্রাইবার

উত্তর:


1

আমি নিশ্চিত নই, তবে আমি দিতাম যে অভ্যন্তরীণ কোডটি AsyncTaskকার্সার লোডার loadInBackground()পদ্ধতির জন্য একটি ব্যবহার করার চেষ্টা করছে to আপনি হয়ত কোনও অচলাবস্থা দেখছেন কারণ AsyncTaskপ্রার্থনা করার চেষ্টা করেছে onPostExecute()। এই কলটি আপনার প্রধান ইউআই থ্রেডে চালানোর চেষ্টা করবে, যা আপনার পরীক্ষার রুটিনের থ্রেড হিসাবে ঘটে। এটি কখনই ঘটতে পারে না কারণ আপনি কল স্ট্যাকটিতে নিজের পরীক্ষার রুটিনের সাথে একটি ওয়েটে আটকে আছেন।

আপনার উপহাসকে উচ্চ স্তরে নিয়ে যাওয়ার চেষ্টা করুন যাতে পরীক্ষা থেকে ব্যাকগ্রাউন্ডে সত্যিই কিছু না ঘটে। গুগল `অ্যাসিঙ্কটাস্ক ইউনিট পরীক্ষা অ্যান্ড্রয়েড ডেডলক ' অন্যান্য লোকেরা যেখানে একই সমস্যায় পড়েছে তার উদাহরণগুলি দেখতে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.