2017-05-03 4 views
1

Je veux tester avec Espresso cadre de test android que tous les titres attendus sont affichés dans ListView.Affirmation correcte avec Espresso J'ai élément énuméré dans ListView

J'ai une activité avec ListView qui montre les fichiers dans le répertoire. Chaque élément ListView est un Item objet:

/** 
* Item 
*/ 
static class Item { 
    private String title; 
    private IFileInfo fileInfo; 
    private int imageResourceId; 

    public Item(String title, IFileInfo fileInfo, int imageResourceId) 
    { 
     this.title = title; 
     this.fileInfo = fileInfo; 
     this.imageResourceId = imageResourceId; 
    } 

    public IFileInfo getFileInfo() { 
     return fileInfo; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public int getImageResourceId() { 
     return imageResourceId; 
    } 
} 

Le titulaire fixe juste titre et de l'image pour l'article:

/** 
* Adapter 
*/ 
private class Adapter extends ArrayAdapter<Item> { 

    private LayoutInflater layoutInflater; 

    public Adapter(Context context, List<Item> objects) { 
     super(context, 0, objects); 
     layoutInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.file_dialog_row, null); 
      convertView.setTag(new Holder(convertView)); 
     } 

     Item item = getItem(position); 
     Holder holder = (Holder) convertView.getTag(); 
     holder.getTitleView().setText(item.getTitle()); 
     holder.getTitleView().setTextColor(itemColorStateList); 
     holder.getImageView().setImageResource(item.getImageResourceId()); 
     return convertView; 
    } 
} 

Aménagement:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" android:layout_height="wrap_content"> 

<ImageView android:layout_alignParentLeft="true" android:id="@+id/fdrowimage" 
    android:layout_height="wrap_content" android:layout_width="wrap_content" 
    android:paddingRight="3dp" android:paddingLeft="3dp"/> 

<TextView android:text="@+id/fdrowtext" android:layout_width="wrap_content" 
    android:id="@+id/fdrowtext" 
    android:layout_alignTop="@+id/fdrowimage" android:layout_alignBottom="@+id/fdrowimage" 
    android:gravity="center_vertical" android:layout_height="wrap_content" 
    android:textSize="19dp"/> 

A l'origine je voulais pour affirmer que l'objet avec le texte "N" est listé (j'ai une liste de Item objets et je veux affirmer pour chacun il est montré).

Pour vérifier que cela fonctionne en fait, je l'ai vérifié le test devrait échouer pour un certain titre de l'article fait pas montré, mais pour une raison quelconque les essais succès:

onData(allOf(is(instanceOf(Item.class)), withText("someNotListedItemTitle"), isDisplayed())); 

Voici le code de test complet:

... 

@Test 
public void testShowFiles() throws IOException { 
    List<File> files = new LinkedList<>(); 
    for (int i = 0; i < 10; i++) { 
     File tmpFile = new File(rootFilesFolder, generateUniqueString()); 
     files.add(tmpFile); 

     if (i % 2 == 0) 
      FileUtils.touch(tmpFile); // create file 
     else 
      FileUtils.forceMkdir(tmpFile); // create folder 
    } 

    // add not shown for sure in ListView item 
    File notExistingListed = new File(rootFilesFolder, generateUniqueString()); 
    files.add(notExistingListed); 

    // activity creates ListView that shows file name for each file in TextView with @+id/fdrowtext 
    startActivityForPath(rootFilesFolder); 

    for (File eachFile : files) { 
     // should fail for `notExistingListed` 
     onData(anyOf(is(instanceOf(Item.class)), withText(eachFile.getName()), isDisplayed())); 
    } 
} 

Quelle est l'assertion correcte avec Espresso? Devrais-je créer un Matcher personnalisé pour mon article?

Répondre

0

J'ai de l'expérience avec le framework de test Espresso. Mais je RecyclerView au lieu de ListView et il y a certaines fonctionnalités dans ce cadre en ce qui concerne RecyclerView comme:

onView(withId(R.id.recycler_view)).perform(
      actionOnItemAtPosition(itemPosition, swipeLeft())); 

Et je l'ai fait le matcher personnalisé pour RecyclerView articles, ressemble à:

onView(withRecyclerView(R.id.recycler_view). 
       atPositionOnView(itemPosition, R.id.child_view)). 
       check(matches(withText("Element 1"))); 

Je peut affirmer la valeur de n'importe quelle vue sur une position dans RecyclerView

S'il vous plaît, laissez-moi savoir si vous avez besoin de plus d'informations à ce sujet.

+0

Il existe une différence significative entre 'ListView' et' RecyclerView' comme indiqué ici: https://google.github.io/android-testing-support-library/docs/espresso/lists/ – 4ntoine

0

j'ai pu contourner ce avec withText au lieu de onData, mais il semble être un sale tour:

for (File eachFile : files) { 
    onView(withText(eachFile.getName())).check(matches(isDisplayed())); 
} 

Quelle est l'affirmation correcte avec onData?