2014-12-21 3 views
1

Я пытаюсь добавить контакт с менеджером контактов Android от Espresso, но это не сработает.Espresso и Android contact picker

Это команда для вызова контакта подборщика:

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

Средство выбора отображается, когда я запускаю тест Espresso. ОК, теперь я пытаюсь выбрать конкретную запись контакта по отображаемому имени (например, «Джейк»). К сожалению, я не знаю, как это сделать. Я попытался следующие:

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

Я также попробовал этот вариант:

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

Нет успеха с обоими подходами. Как уже упоминалось, отображается команда выбора контактов, но ничего не выбрано.

Любая идея?

+0

у вас есть полный ответ сейчас, дайте нам знать, если он работает для вас, и не забудьте принять его, если это полезно , – appoll

ответ

2

То, что вы испытываете, является нормальным поведением, поскольку элемент выбора контактов относится к внешнему действию, интерфейс пользователя которого нельзя манипулировать. Попытка утверждать что-либо приведет к тестам сваливания в течение некоторого времени, и в конечном итоге с

android.support.test.espresso.NoActivityResumedException: Никакой деятельности в стадии не возобновилась. Вы забыли запустить эту деятельность. (test.getActivity() или аналогичный)?

Однако, поздороваться новорождённым Espresso-Intents, который находится здесь, чтобы спасти свою репутацию:

Использование намеревающегося API (кузен Mockito.when), вы можете предоставить ответ на деятельность которые запускаются с startActivityForResult

UPDATE Ниже мое текущее решение, которое работает нормально, но потребуется несколько приличных кода кл Ean до:

@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")))); 
    } 

В пусковую деятельности, я бы обрабатывать поступающую намерение с контактом Ури и делать все, что нужно с ним.

@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; 
    } 
+1

Намеченное намерение не сработало для меня. Это, по-видимому, из-за намерения, которое я использую, чтобы вызвать контактную группу. Я создаю намерение с помощью «New Intent (Intent.ACTION_PICK)», и соответственно то, что работает, чтобы высмеять намерение, «намеревается (hasAction (Intent.ACTION_PICK)). ResponseWith (result);». – stevehs17

Смежные вопросы