2015-11-18 1 views
5

В моем приложении, когда пользователь нажимает кнопку «Зарегистрироваться», запускается RegisterActivity. После того, как пользователь заполнит форму, данные будут отправлены в веб-службу, и если регистрация будет успешной, RegisterActivity finsihes с RESULT_OK. Это обобщается в примере кода ниже:Espresso: Как я могу проверить, что действие завершено с результатом RESULT_OK

public void submitRegistration() { 

    showProgressDialog(R.string.registration, R.string.please_wait); 

    getWebApi().register(buildRegistrationFromUI(), new Callback<ApiResponse>() { 
     @Override 
     public void success(ApiResponse apiResponse, Response response) { 

      hideProgressDialog(); 

      setResult(RESULT_OK); 
      finish(); 
     } 

     @Override 
     public void failure(RetrofitError error) { 

      hideProgressDialog(); 
      showErrorDialog(ApiError.parse(error)); 
     } 
    }); 
} 

Использование Espresso, Как я могу проверить, что деятельность закончил с setResult(RESULT_OK).

Обращаем ваше внимание, что НЕ хочу создать умышленное намерение, я хочу проверить статус результата намерения.

метод
+0

[Похоже, на это уже был дан ответ] (https://stackoverflow.com/questions/5569830/get-result-from-an-activity-after-finish-in-an-android-unit-test), используя отражение, чтобы получить значения из активности. –

ответ

8

Все setResult (...) не является изменение значений полей в классе активность

public final void setResult(int resultCode, Intent data) { 
    synchronized (this) { 
     mResultCode = resultCode; 
     mResultData = data; 
    } 
} 

Таким образом, мы можем использовать Java Reflection для доступа к полю mResultCode, чтобы проверить, если значение имеет действительно было установлено значение RESULT_OK.

@Rule 
public ActivityTestRule<ContactsActivity> mActivityRule = new ActivityTestRule<>(
     ContactsActivity.class); 


@Test 
public void testResultOk() throws NoSuchFieldException, IllegalAccessException { 
    Field f = Activity.class.getDeclaredField("mResultCode"); //NoSuchFieldException 
    f.setAccessible(true); 
    int mResultCode = f.getInt(mActivityRule.getActivity()); 

    assertTrue("The result code is not ok. ", mResultCode == Activity.RESULT_OK); 
} 
0

Не уверен, правильно ли я понял вопрос. Однако при закрытии вашей активности, если основное приложение все еще открыто, вы можете проверить результат операции. Вам нужно показать статус результата в коде приложения и написать комментарий, чтобы проверить, совпадает ли он с ожидаемым.

2

Вы можете просто использовать ActivityTestRule и получить результат деятельности, как это:

assertThat(rule.getActivityResult(), hasResultCode(Activity.RESULT_OK)); 
assertThat(rule.getActivityResult(), hasResultData(IntentMatchers.hasExtraWithKey(PickActivity.EXTRA_PICKED_NUMBER))); 

Полного пример доступного here.

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