Espresso:测试startActivityForResult返回RESULT_OK

时间:2015-05-18 17:07:52

标签: android unit-testing android-espresso start-activity

好的,这是我的问题,

我有一个需要使用身份验证的Android应用。 随着项目的成长,我想在我的应用程序中添加单元测试。

为此,我使用Espresso 2.1

事情是:

  1. 我的LoginActivitystartActivityForResult
  2. 调用
  3. 显示表格
  4. 一个。如果凭据有误,则会保留在LoginActivity
  5. 湾如果凭据没问题,则finish使用RESULT_OK
  6. 所以在我的 espresso 测试类中,我有一些单元测试。 not ok 的情况一切都很好,问题出在 ok 的情况。

    我需要检查结果是否为RESULT_OK,但随着活动结束,espresso失败,

    android.support.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)?
    

    以下是我的问题:

    • 有没有办法测试setResult的{​​{1}}?
    • 是否有解决方法(我不想使用其中任何一个,但至少......)才能测试?

    我已经阅读了关于Espresso-Intents的内容,但我无法弄清楚如何启动自己的包的活动并检查结果是Activity

    感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

非常简短的回答:

  • 是的,可以通过执行

    来设置结果
    Intent resultData = new Intent();
    resultData.setData(...);
    Instrumentation.ActivityResult result = new Instrumentation.ActivityResult(Activity.RESULT_OK, resultData);
    intending(toPackage("package.containing.login.activity")).respondWith(result);
    

您将通过检查其中一个视图是否包含所需的返回信息来评估是否收到了RESULT_OK。 如果不够清楚,请在评论中发布任何问题并尝试提供帮助。

  

我如何开始自己的套餐活动

用户将如何做?可能通过点击按钮或任何其他视图交互,对吧?

答案 1 :(得分:-1)

你真的需要Espresso进行这项测试吗? Robolectric ActivityShadow有getResultCode()和getResultIntent()方法。

final Intent startIntent = new Intent();
final ResultActivity activity = Robolectric.buildActivity(ResultActivity.class)
    .withIntent(startIntent)
    .create()
    .get();

final String data = "data";
activity.onEventMainThread(new CompletedEvent(data));

assertEquals(RESULT_OK, shadowOf(activity).getResultCode());

final Intent resultIntent = shadowOf(activity).getResultIntent();
assertEquals(data, resultIntent.getStringExtra(DATA_KEY));

ResultActivity设置结果并在收到CompletedEvent后结束。在此测试中,直接调用事件处理程序来模拟事件。