Инструмент за избор на контакти за Espresso и Android

Опитвам се да добавя контакт с Android инструмент за избор на контакти от Espresso, но това не работи.

Това е командата за извикване на инструмента за избор на контакт:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, RC_PICK_CONTACT);

Изборът на контакт се показва, когато стартирам тест за еспресо. Добре, сега се опитвам да избера конкретен запис за контакт по показвано име (напр. „Джейк“). За съжаление не знам как да постигна това. Опитах следното:

onData(withItemContent("Jake")).inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView())))).perform(click()); 

Пробвах и този вариант:

onView(withText("Jake")).inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView())))).perform(click());

Няма успех и с двата подхода. Както вече споменахме, инструментът за избор на контакт се показва, но нищо не е избрано.

Някаква идея?


person Community    schedule 21.12.2014    source източник
comment
сега имате пълен отговор, уведомете ни дали работи за вас и не забравяйте да го приемете, ако е полезен.   -  person appoll    schedule 29.04.2015


Отговори (1)


Това, което изпитвате, е нормално поведение, тъй като инструментът за избор на контакт принадлежи на външна дейност, чийто потребителски интерфейс не може да бъде манипулиран. Опитът да се твърди нещо ще доведе до забавяне на тестовете за известно време и завършване с a

android.support.test.espresso.NoActivityResumedException: Няма дейности в етап ВЪЗОБНОВЕН. Забравихте ли да стартирате дейността. (test.getActivity() или подобен)?

Все пак кажете здравей на новородените Espresso-Intents, който е тук, за да ми спаси репутацията:

Използвайки предвидения API (братовчед на Mockito.when), можете да предоставите отговор за дейности, които се стартират с startActivityForResult

АКТУАЛИЗАЦИЯ По-долу е текущото ми решение, което работи добре, но ще се нуждае от прилично почистване на кода:

    @Test
    public void testContactPickerResult(){

        Intent resultData = new Intent();
        resultData.setData(getContactUriByName("Joah"));
        Instrumentation.ActivityResult result = new Instrumentation.ActivityResult(Activity.RESULT_OK, resultData);

        intending(toPackage("com.google.android.contacts")).respondWith(result);

        onView(withId(R.id.contactPickerLauncher))
                .check(matches(isDisplayed()))
                .perform(click());

        onView(withId(R.id.pickedContact))
                .check(matches(withText(getContactNumberByName("Joah"))));
    }

В дейността по стартиране бих обработвал входящото намерение с Uri за контакт и бих направил каквото е необходимо с него.

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        TextView result = (TextView) findViewById(R.id.pickedContact);

        if (requestCode == 42 && resultCode == RESULT_OK){
            Uri contactUri = data.getData();             
            String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER};
            Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null);
            cursor.moveToFirst();
            int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
            String number = cursor.getString(column);
            result.setText(number);
        }
    }

Също така, помощните методи, които трябва да бъдат съответно модифицирани:

public Uri getContactUriByName(String contactName) {
        Cursor cursor = mActivityRule.getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);

        if (cursor.getCount() > 0) {
            while (cursor.moveToNext()) {
                String id = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID));
                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                if (name.equals(contactName)) {
                    return Uri.withAppendedPath(ContactsContract.Data.CONTENT_URI, id);
                }
            }
        }
        return null;
    }
person appoll    schedule 28.04.2015
comment
Подиграваното намерение не ми подейства. Това вероятно се дължи на намерението, което използвам, за да изведа инструмента за избор на контакт. Създавам намерението с new Intent(Intent.ACTION_PICK) и съответно това, което работи за подиграване на намерението, е intending(hasAction(Intent.ACTION_PICK)).respondWith(result);. - person stevehs17; 03.11.2016