【问题标题】:How to test for the appearance of a Toast message如何测试 Toast 消息的外观
【发布时间】:2011-01-25 04:38:36
【问题描述】:

有人知道如何测试 Activity 上 Toast 消息的外观吗?

我正在使用类似于 OP 在this question 上发布的代码来测试我的程序从一个活动到下一个活动的流程。我还希望能够测试特定活动的 toast 消息。

【问题讨论】:

    标签: android functional-testing


    【解决方案1】:

    有谁知道如何测试 Toast 消息出现在 活动?

    你不能——抱歉。我的意思是,没有办法问 Android “嘿,正在播放 Toast 吗?它看起来像什么?”。

    【讨论】:

    • 感谢 CommonsWare。在创建 toast 时,我可能会做一些事情,比如用 toast 消息填充变量。它对用户是不可见的,但会给我一些检查的东西。
    • 瞧:myToast.getView().isShown()。
    【解决方案2】:

    我们现在实际上可以使用 robolectric 测试 toast 消息。下面的例子是我们团队目前的做法:

        @Test
        public void ccButtonDisplaysToast() throws NullPointerException {
            Button ccRedButton = (Button) findViewById(R.id.cc_red);
            cc_red.performClick(); --> this calls the actual onClickListener implementation which has the toast.
            ShadowLooper.idleMainLooper(YOUR_TIME_HERE); --> This may help you.
            assertThat(ShadowToast.getTextOfLatestToast().toString(), equalTo("TEST_YOUR_TEXT_HERE"));
        }
    

    希望对你有帮助

    【讨论】:

    • 在我看来,在您调用performClick() 并执行断言之间,toast 可能尚未出现并且会在断言完成后出现。我们如何解释这种可能性?
    • Robolectric 有一个 shadowHandler.idleMainLooper 已被弃用。然而有一个 ShadowLooper.idleMainLooper() 有多个实现。其中之一将“时间”作为参数来触发执行..
    【解决方案3】:

    嗯,其实有可以测试吐司的外观。只需创建一个 Toast 的子类(例如 MyOwnToast)并在您的程序中使用它而不是 Toast。在这个子类中,您可以覆盖 show() 方法来通知您,正在显示 Toast。

    此外,您可以将 Toast 以 ToastDatabase 单例的形式存储在 show() 方法中,您可以从中访问 Toast,并且在显示和销毁后也可以查看它(尚未使用 Toast 进行测试,但我通常这样做是为了让活动的结果意图在它们被销毁后保持可用于进一步的测试 - 所以用 Toasts 实现这一点应该没有问题)。

    注意:也许您必须克隆 Toast 对象或其对应的 ToastDatabase 视图,因为在 Toast 被销毁后它可能会为空。希望这会有所帮助!

    【讨论】:

    • 谢谢你的 lordfinga。听起来比我描述的更简洁。
    • 好主意 - 但在仅出于测试目的将代码添加到生产代码时要小心。我会推荐一种在最终生产代码中禁用此“测试代码”的方法,可能是通过检查清单 stackoverflow.com/a/4277868/383414 中的调试标志
    【解决方案4】:

    我检查,以下工作:

    if(someToast == null)
        someToast = Toast.makeText(this, "sdfdsf", Toast.LENGTH_LONG);
    boolean isShown = someToast.getView().isShown();
    

    【讨论】:

    • 如果我们确实在问“ActivityUnitTestCase 如何断言生产代码触发了包含某某内容的 Toast”,那么这样的测试不应依赖于额外的生产代码。例如,如果您重构了该代码,您不希望测试中断,而在生产中仍会显示真正的 Toast。
    【解决方案5】:

    您可以检查 toast 是否显示在消息中

    ShadowToast.showedToast("expected message")
    

    如果您使用的是自定义吐司

    ShadowToast.showedToast("expected message", R.id.yourToastId)
    

    【讨论】:

      【解决方案6】:

      你可以选择Robolectric测试框架。检查toast,你可以使用如下:

      assertTrue(ShadowToast.showedCustomToast("message", R.id.message)); //R.id.message: textView ID
      

      【讨论】:

        【解决方案7】:

        对于那些现在在 2019 年使用 AndroidX 测试 API 并为 toast 使用自定义布局的用户,试试这个 (Kotlin):

        @RunWith(AndroidJUnit4:class)
        class ActivityUnitTest {
            private lateinit var scenario: ActivityScenario<MainActivity>
        
            @Before fun setUp() {
                scenario = ActivityScenario.launch(MainActivity::class.java)
            }
        
            @Test fun shouldDisplayToastErrorMessageIfSearchFieldIsEmpty() {
                scenario.onActivity { activity ->
                    activity.id_of_button.performClick()
                    assertThat(
                        ShadowToast.getLatestToast().view.id_of_textview.text.toString(),
                        equalTo("Text to be tested")
                    )
                }
            }
        }
        

        【讨论】:

          【解决方案8】:

          (科特林)呢:

          onView(withText("Text of the toast"))
                  .inRoot(withDecorView(not(`is`(window.decorView))))
                  .check(matches(isDisplayed()))
          

          【讨论】:

            【解决方案9】:

            我正在使用它:

            wait_for_text("Notification message to be verified", timeout: 30)
            

            这是部分达到目的的替代方式。

            【讨论】:

            • 什么是wait_for_text()? Android API 中没有同名的方法。
            • 如果您使用的不是 Java 语言,您应该指定。
            • "wait_for_text" 是 ruby​​ 中 Calabash api 中的一个方法
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多