【问题标题】:Espresso : test startActivityForResult return RESULT_OK浓缩咖啡:测试 startActivityForResult 返回 RESULT_OK
【发布时间】:2015-05-18 17:07:51
【问题描述】:

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

为此,我使用Espresso 2.1

事情是这样的:

  1. 我的LoginActivitystartActivityForResult 调用
  2. 显示形式
  3. 一个。如果凭据错误,它将保留在LoginActivity
  4. 乙。如果凭据没问题,则使用finishRESULT_OK

所以在我的 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)?

这是我的问题:

  • 有没有办法测试ActivitysetResult
  • 是否有一种解决方法(我不想使用它们中的任何一种,但至少...)能够对其进行测试?

我已经阅读了有关 Espresso-Intents 的内容,但我无法找到一个示例来说明如何启动我自己的包的活动并检查结果是否为 RESULT_OK

【问题讨论】:

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


【解决方案1】:

非常简短的回答:

  • 是的,可以通过做设置结果

    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。 如果这还不够清楚,请在 cmets 中发布任何问题,并会尽力提供帮助。

如何开始我自己的活动包

用户会怎么做?可能是通过单击按钮或任何其他视图交互,对吧?

【讨论】:

  • 好吧,我想我明白了,但是:仪器类扩展了ActivityInstrumentationTestCase2<LoginActivity>,所以我已经在使用它了。事实上,是 espresso 为我启动了 LoginActivity。所以我想我可以这样做:intending(toPackage("package#LoginActivity")).respondWith(result);。我会尽快尝试,然后我会回来,无论如何感谢您的回答 EDIT:这不起作用,因为我无法编辑 intendingrespondWith 之间的字段
  • 请注意,在 Espresso 2.1 中不推荐使用 ActivityInstrumentationTestCase2,您应该改用 ActivityTestRule。在您的具体情况下 IntentTestRule.
  • 只有在您将意图(以及您创建的结果)发送回初始活动后,才会调用 respondWith。一步一步,您将: 1. 用结果创建意图。 2. 填写表格。 3. 触发返回意图(登录按钮)
  • 我想我明白了,但不确定,事实上intending 是在“嘲笑”结果。我的意思是,它会像登录一样起作用?所以它不会检查登录是否有效,但它会伪造一个正确的登录但返回RESULT_OK
  • 类似的东西,是的。因此,您将对成功/不成功的登录进行两种不同的测试。我会尝试尽快重现类似的内容,然后回来更新。
【解决方案2】:

你真的需要 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 后结束。在这个测试中,直接调用事件处理程序来模拟事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多