2010-03-08 38 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)