2010-03-08 71 views
31

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

我使用的代码类似于OP发布在this question上的代码,用于测试从一个活动到另一个活动的程序流。我也希望能够测试特定活动的吐司消息。

回答

22

是否有人知道如何测试 活动上Toast消息的外观 ?

你不能 - 对不起。我的意思是,没有办法问Android“嘿,吐司是什么样的?它看起来像什么?”。

+1

感谢您的CommonsWare。我可能会做一些事情,比如在创建Toast时用Toast消息填充一个变量。它对用户是不可见的,但会给我一些东西来检查。 – Adrian 2010-03-12 20:59:09

+9

Voilà:myToast.getView()。isShown()。 – 2012-08-08 06:21:47

12

嗯,其实测试烤面包的外观的可能性。只需创建一个Toast的子类(例如MyOwnToast),然后在程序中使用此类代替Toast。在这个子类中,你可以覆盖show()方法来通知你,Toast正在显示。

此外,您可以在show()方法中以ToastDatabase单例的类型存储Toast,从中可以访问Toast,它也是在它已被显示和销毁之后的视图(尚未使用Toasts进行测试,但是我经常这样做,其结果意图是让它们在被销毁之后用于进一步的测试 - 因此用Toast来实现这一点应该没有问题)。

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

+0

感谢那个lordfinga。听起来像一个比我描述的整洁的解决方案。 – Adrian 2010-03-29 19:53:35

+2

好主意 - 但在为了测试目的而将代码添加到产品代码时要小心。我会推荐一种方法在最终生产代码中禁用此“测试代码”,可能通过检查清单中的调试标志http://stackoverflow.com/a/4277868/383414 – 2012-04-26 13:53:24

6

我检查一下,以下工作:

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

如果我们的确在问“怎么可以一个ActivityUnitTestCase断言生产代码用某种内容引发了Toast“,那么这样的测试不应该依赖额外的生产代码。例如,如果您重构了代码,那么您不希望测试中断,而在生产中仍会显示真正的Toast。 – Phlip 2013-09-29 00:56:43

2

你可以选择Robolectric测试framework.For检查敬酒,你可以如下使用它:

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

我使用它喜欢:

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

这是部分服务于此目的的替代方式。

+0

什么是wait_for_text()?这个名称在Android API中没有任何方法。 – 2015-06-16 03:06:17

+0

如果您使用的不是Java语言,您应该指定。 – 2015-06-16 03:10:05

+0

“wait_for_text”是Calabash api中的一种方法ruby – 2015-07-01 09:47:02

8

我们实际上现在可以使用robolectric来测试吐司消息。下面的例子是我们的团队是如何做这个现在:

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

希望这有助于

+0

在我看来,在你调用'performClick()'的时间之间,并断言可能还没有出现烤面包,并且会在断言之后出现饰面。我们如何解释这种可能性? – 2015-06-16 14:54:39

+0

Robolectric有一个已被弃用的shadowHandler.idleMainLooper。然而有一个ShadowLooper.idleMainLooper()有多个实现。其中一人以“时间”作为触发执行的参数。 – user2511882 2015-06-16 16:09:13

2

你可以检查如果您正在使用自定义的面包是由消息

ShadowToast.showedToast("expected message") 

所示吐司

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