2014-10-01 12 views
8

Espresso'yla tek bir test hatası yapıyorum. Aşağıda, görüntülenen bir iletişim kutusunda bir TextView test etmektir. Aşağıdaki hatayı alıyorum: Espresso withText in TextView Seçili eşleşme görüntülenmiyor. Göster View

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) 

Yani açıkça, görünüm bulunur ve bunun ayrıntıları var içinde, sen değer Beklediğim = metni görebilirsiniz. Yine de uymuyor diyor. Görüntüle istisna görünümü hiyerarşisinde gösterir bile aracılığıyla şu testi açıklamada

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

ben de aşağıdaki deyimi ile yapıyor çalıştı, ancak bir NoMatchingViewException var olan çalıştırılır.

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

bu başarısız neden üzerinde herhangi bir yardım? Ifade ile bir kardeşi alanda withText() isDisplayed() yapabiliyorum dikkati.

+10

Espresso ile birlikte gelen dahili withText (int resourceId) buggy'dir. Yalnızca kontrol edilen metin bir java.lang.String ise, ancak kullanılan birçok metin, Düzenlenebilir veya Kullanılabilir gibi diğer CharSequence alt sınıflarıdır. Birlikte yazdığınız metnin türünün aslında Dize olduğundan ve türüne bakmadan Dize içeriğiyle eşleşen kendi eşleştiricinizi yazmamasına dikkat edin. – haffax

+0

@haffax Mükemmel! Metni TextView'de bir Html.fromHtml() ile ayarlamıştım. Bu da elbette bir Spanned nesnesiyle sonuçlandı. # #MatchesSafely() 'de textView.getText()' de #toString() yaptıran özel bir eşleştirici yazdı ve mükemmel çalışıyor. Bunu bir cevap olarak göndermek isterseniz, kabul edildi olarak işaretleyeceğim, teşekkürler! – JCricket

cevap

2

Bu cevap, @ haffax'ın yukarıdaki yorumu temel alınarak oluşturuldu.

/** 
* 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

Bu, Espresso 2.2.2'de doğru şekilde ele alınmıştır. – TWiStErRob

İlgili konular