2014-10-01 14 views
8

Występuje dziwny test przy użyciu Espresso. Poniżej przedstawiono testowanie TextView w wyświetlonym oknie dialogowym. Pojawia się następujący błąd:Espresso z tekstem w widoku tekstowym nie pasuje do wybranego widoku

com.google.android.apps.common.testing.ui.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'with string from resource id: <2131099772>' doesn't match the selected view. 
Expected: with string from resource id: <2131099772>[my_content] value: Test Content Available 
Got: "TextView{id=2131296340, res-name=dialog_content, visibility=VISIBLE, width=620, height=38, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=Test Content Available, input-type=0, ime-target=false}" 

at dalvik.system.VMStack.getThreadStackTrace(Native Method) 
at java.lang.Thread.getStackTrace(Thread.java:579) 
at com.google.android.apps.common.testing.ui.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:69) 
at com.google.android.apps.common.testing.ui.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:40) 
at com.google.android.apps.common.testing.ui.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:159) 
at com.google.android.apps.common.testing.ui.espresso.ViewInteraction.check(ViewInteraction.java:133) 
at com.myapp.testContentDetails(FPATest.java:109) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214) 
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199) 
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554) 
at com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner.onStart(GoogleInstrumentationTestRunner.java:167) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701) 
Caused by: junit.framework.AssertionFailedError: 'with string from resource id: <2131099772>' doesn't match the selected view. 
Expected: with string from resource id: <2131099772>[my_content] value: Test Content Available 
Got: "TextView{id=2131296340, res-name=dialog_content, visibility=VISIBLE, width=620, height=38, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=Test Content Available, input-type=0, ime-target=false}" 

at com.google.android.apps.common.testing.ui.espresso.matcher.ViewMatchers.assertThat(ViewMatchers.java:789) 
at com.google.android.apps.common.testing.ui.espresso.assertion.ViewAssertions$2.check(ViewAssertions.java:76) 
at com.google.android.apps.common.testing.ui.espresso.ViewInteraction$2.run(ViewInteraction.java:145) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at android.os.Handler.handleCallback(Handler.java:733) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5081) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:781) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
at dalvik.system.NativeStart.main(Native Method) 

więc wyraźnie, że widok zostanie znaleziony, a w jego szczegóły można zobaczyć tekst = wartość Czekam. Jednak mówi, że nie pasuje. Jest prowadzony z następującym stwierdzeniem testowym

onView(withId(R.id.dialog_content)).check(
       matches(withText(R.string.my_content))); 

Próbowałem to robić z następującym stwierdzeniem, jak również, ale dostałem NoMatchingViewException, nawet poprzez View przedstawia w hierarchii widoku wyjątku.

onView(withText(R.string.my_content)).check(
       matches(isDisplayed())); 

Dowolna pomoc dotycząca przyczyn niepowodzenia? Warto zauważyć, że jestem w stanie withText() isDisplayed() na polu rodzeństwa w oknie dialogowym.

+10

Wbudowany tekst withText (int resourceId) dostarczany z Espresso jest błędny. Działa tylko wtedy, gdy sprawdzany tekst to java.lang.String, ale wiele użytych tekstów to inne podklasy CharSequence, takie jak Editable lub Spannable. Upewnij się, że typ tekstu, w którym się znajdujesz, jest w rzeczywistości ciągiem, a jeśli nie, napisz własny szablon dopasowujący zawartość String bez patrzenia na typ. – haffax

+0

@haffax Perfect! Ustawiłem tekst w TextView za pomocą Html.fromHtml(), co oczywiście skutkowało pomieszaniem obiektu. Napisał niestandardowy matcher, który właśnie zrobił #toString() na textView.getText() w #matchesSafely() i działa idealnie. Jeśli chcesz przesłać to jako odpowiedź, oznaczę to jako zaakceptowane, dzięki! – JCricket

Odpowiedz

2

Ta odpowiedź została utworzona na podstawie powyższego komentarza @ haffax.

/** 
* Original source from Espresso library, modified to handle spanned fields 
* 
* Returns a matcher that matches a descendant of {@link TextView} that is 
* displaying the string associated with the given resource id. 
* 
* @param resourceId 
*   the string resource the text view is expected to hold. 
*/ 
public static Matcher<View> withText(final int resourceId) { 

    return new BoundedMatcher<View, TextView>(TextView.class) { 
     private String resourceName = null; 
     private String expectedText = null; 

     @Override 
     public void describeTo(Description description) { 
      description.appendText("with string from resource id: "); 
      description.appendValue(resourceId); 
      if (null != this.resourceName) { 
       description.appendText("["); 
       description.appendText(this.resourceName); 
       description.appendText("]"); 
      } 
      if (null != this.expectedText) { 
       description.appendText(" value: "); 
       description.appendText(this.expectedText); 
      } 
     } 

     @Override 
     public boolean matchesSafely(TextView textView) { 
      if (null == this.expectedText) { 
       try { 
        this.expectedText = textView.getResources().getString(
          resourceId); 
        this.resourceName = textView.getResources() 
          .getResourceEntryName(resourceId); 
       } catch (Resources.NotFoundException ignored) { 
        /* 
        * view could be from a context unaware of the resource 
        * id. 
        */ 
       } 
      } 
      if (null != this.expectedText) { 
       return this.expectedText.equals(textView.getText() 
         .toString()); 
      } else { 
       return false; 
      } 
     } 
    }; 
} 
+2

To jest poprawnie obsługiwane w Espresso 2.2.2. – TWiStErRob

Powiązane problemy