2010-03-08 1 views
31

Кто-нибудь знает, как тестировать появление сообщения Toast на мероприятии?Как проверить появление сообщения Toast

Я использую код, похожий на то, что OP размещен на this question для тестирования потока моей программы от одного действия к другому. Я также хотел бы проверить тестовые сообщения на конкретные действия.

ответ

22

ли кто-нибудь знает, как проверить для появления сообщения Toast на в деятельности?

Вы не можете - извините. К тому, я имею в виду, что нет никакого способа спросить Android «эй, это тост показывается? И на что это похоже?».

+1

Спасибо за это CommonsWare. Я, вероятно, сделаю что-то вроде заполнения переменной тостом при создании тоста. Он будет невидим для пользователя, но даст мне что-то для изучения. – Adrian

+9

Voilà: myToast.getView(). IsShown(). –

12

Хм, на самом деле там is Возможность проверить внешний вид тоста. Просто создайте подкласс Toast (например, MyOwnToast) и используйте его в своей программе вместо Toast. В этом подклассе вы можете перезаписать метод show(), чтобы уведомить вас о том, что отображается Toast.

Кроме того, вы можете хранить Toast в методе show() в виде однотонального тоста ToastDatabase, из которого вы можете получить доступ к Toast и его вид также после того, как он был показан и уничтожен (не тестировал это с помощью Toasts, но Я часто делаю это с результатом, направленным на то, чтобы сделать их доступными для дальнейших испытаний после их уничтожения - поэтому не должно быть никаких проблем с реализацией этого с Тостами).

Остерегайтесь: возможно, вам нужно клонировать объект Toast или соответствующий ему вид для ToastDatabase, потому что, вероятно, он будет пустым после того, как Toast будет уничтожен. Надеюсь это поможет!

+0

Спасибо, что лордфинга. Звучит как более аккуратное решение, чем я описывал. – Adrian

+2

Хорошая идея - но будьте осторожны при добавлении кода в производственный код только для целей тестирования. Я бы рекомендовал метод отключить этот «тестовый код» в конечном производственном коде, возможно, проверив флаг отладки в манифесте http://stackoverflow.com/a/4277868/383414 –

6

проверить, следующие работы:

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

Если мы действительно спрашиваем «как можно ActivityUnitTestCase утверждают, что производственный код запускал Toast с таким-то содержимым », то такой тест не должен зависеть от дополнительного производственного кода. Если, например, вы реорганизовали этот код, вы бы не хотели, чтобы тест ломался, когда в производстве все еще отображается настоящий тост. – Phlip

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 нет такого имени. –

+0

Если вы используете язык, отличный от Java, вы должны указать. –

+0

«wait_for_text» - это метод в Calabash api in ruby. –

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()' и утверждаете, что возможно, что тост еще не появился и появится после утверждения отделки. Как мы объясняем эту возможность? –

+0

У Robolectric есть shadowHandler.idleMainLooper, который устарел. Тем не менее существует ShadowLooper.idleMainLooper(), который имеет несколько реализаций. Один из них принимает «время» в качестве параметров для запуска выполнения. – user2511882

2

Вы можете проверить, что тост был показан сообщением

ShadowToast.showedToast("expected message") 

Если вы используете пользовательский тост

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