2013-08-02 17 views
8

Piszę test jednostkowy Robolectric i muszę potwierdzić, że ImageView miał setImageResource(int), który wywołał go z określonym identyfikatorem zasobu. Używam fest-android dla asercji, ale wydaje się, że to nie zawiera tej asercji.Assert ImageView został załadowany specyficznym identyfikatorem zasobów do rysowania

Próbowałem również uzyskać ShadowImageView z Robolectric dla ImageView, ponieważ wiem, że dawał ci dostęp do tego, ale teraz go nie ma.

Wreszcie, próbowałem zadzwonić setImageDrawable w kodzie zamiast setImageResource, to w moim teście dochodzić tak:

assertThat(imageView).hasDrawable(resources.getDrawable(R.drawable.some_drawable)); 

ale to również nie, chociaż komunikat awarii wyraźnie pokazuje, że to ten sam rozciągliwej samopoczucie załadowany.

Odpowiedz

5

skończyło się rozszerzenie fest Androida, aby rozwiązać ten:

public class CustomImageViewAssert extends ImageViewAssert { 

    protected CustomImageViewAssert(ImageView actual) { 
     super(actual); 
    } 

    public CustomImageViewAssert hasDrawableWithId(int resId) { 
     boolean hasDrawable = hasDrawableResourceId(actual.getDrawable(), resId); 
     String errorMessage = String.format("Expected ImageView to have drawable with id <%d>", resId); 
     Assertions.assertThat(hasDrawable).overridingErrorMessage(errorMessage).isTrue(); 
     return this; 
    } 

    private static boolean hasDrawableResourceId(Drawable drawable, int expectedResId) { 
     BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; 
     Bitmap bitmap = bitmapDrawable.getBitmap(); 
     ShadowBitmap shadowBitmap = (ShadowBitmap) shadowOf(bitmap); 
     int loadedFromResourceId = shadowBitmap.getCreatedFromResId(); 
     return expectedResId == loadedFromResourceId; 
    } 
} 

Magia sos jest:

ShadowBitmap shadowBitmap = (ShadowBitmap) shadowOf(bitmap); 
int loadedFromResourceId = shadowBitmap.getCreatedFromResId(); 

który jest Robolectric specyficzny, więc nie mogę złożyć wniosek do ściągania Fest - z tym.

23

Z Robolectric 2.2:

Trzeba wziąć niewielki zadnie do osiągnięcia tego celu. ShadowImageView nie pomaga. Zastosowanie ShadowDrawable zamiast:

ImageView imageView = (ImageView) activity.findViewById(R.id.imageview); 
ShadowDrawable shadowDrawable = Robolectric.shadowOf(imageView.getDrawable()); 
assertEquals(R.drawable.expected, shadowDrawable.getCreatedFromResId()); 

nadzieję, że pomoże

+0

działa jak czar –

+2

W robolectric 2.4 jest metoda 'getImageResourceId()' – danielcooperxyz

6

Od Roboelectric 3.0+

W ten sposób można zrobić:

int drawableResId = Shadows.shadowOf(errorImageView.getDrawable()).getCreatedFromResId(); 
assertThat("error image drawable", R.drawable.ic_sentiment_dissatisfied_white_144dp, is(equalTo(drawableResId))); 
Powiązane problemy