Issue
I am testing an app with Espresso
. I have one question is it possible to wait until there are no toast are currently being showed. I have a lot of different toast in my app, but while testing I have problems with them because as far as I can guess focus is gone to the toast and I am getting quite another view hierarchy as I can see in error logs.
So my question is it possible to hide all (system wide with root access) or just wait until there are any toasts on the screen or maybe if it is possible to set focus to the activity view hierarchy manually.
I would be grateful for any help with this problem.
Thank you.
P.S. Disabling toast directly somewhere in my app is not an option because it brings some extra logic into the app which is only required while testing.
Solution
You can let Espresso wait until all toasts are disappeared with a custom idling resource.
Here I use CountingIdlingResource
which is a idling resource managing a counter: when the counter changes from non-zero to zero it notifies the transition callback.
Here is a complete example; the key points follow:
public final class ToastManager {
private static final CountingIdlingResource idlingResource = new CountingIdlingResource("toast");
private static final View.OnAttachStateChangeListener listener = new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(final View v) {
idlingResource.increment();
}
@Override
public void onViewDetachedFromWindow(final View v) {
idlingResource.decrement();
}
};
private ToastManager() { }
public static Toast makeText(final Context context, final CharSequence text, final int duration) {
Toast t = Toast.makeText(context, text, duration);
t.getView().addOnAttachStateChangeListener(listener);
return t;
}
// For testing
public static IdlingResource getIdlingResource() {
return idlingResource;
}
}
How to show the toast:
ToastManager.makeText(this, "Third", Toast.LENGTH_SHORT).show();
How to set-up/tear-down a test:
@Before
public void setUp() throws Exception {
super.setUp();
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
Espresso.registerIdlingResources(ToastManager.getIdlingResource());
getActivity();
}
@After
public void tearDown() throws Exception {
super.tearDown();
Espresso.unregisterIdlingResources(ToastManager.getIdlingResource());
}
Answered By - Gil Vegliach
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.