Comment utiliser l'Espresso à l'élément d'essai dans l'adaptateur à une position spécifique
Je suis en train d'utiliser Espresso (2.0) pour vérifier que le texte dans une liste d'adaptateur élément à une position donnée est correcte, et pour la vie de mon je ne peux pas comprendre les bonnes méthodes à appeler.
Mon type de Carte (IconRowAdapter
) contient une liste de IconRow
objets. Chaque IconRow a un getText()
méthode qui retourne le texte de l'élément.
Ici est la non-Espresso de travail code de test qui vérifie que le IconRow objet à la position 0 à la carte a prévu de texte ("Artistes").
public void testHomeActivityMenu() {
ListView list = (ListView) getActivity().findViewById(R.id.item_list);
IconRowAdapter adapter = (IconRowAdapter) list.getAdapter();
assertEquals(adapter.getItem(0).getText(), "Artists");
}
Cela fonctionne.
J'ai essayé un assortiment de variations sur la suite à Espresso code pour faire la même chose,
onData(is(instanceOf(IconRowAdapter.class)))
.atPosition(0)
.check(matches(withItemContent("Artists")));
où withItemContent()
ressemble à ceci:
public static Matcher<Object> withItemContent(String expectedText) {
checkNotNull(expectedText);
return withItemContent(equalTo(expectedText));
}
@SuppressWarnings("rawtypes")
public static Matcher<Object> withItemContent(final Matcher<String> itemTextMatcher) {
checkNotNull(itemTextMatcher);
return new BoundedMatcher<Object, IconRow>(IconRow.class) {
@Override
public boolean matchesSafely(IconRow iconRow) {
return itemTextMatcher.matches(iconRow.getText());
}
@Override
public void describeTo(Description description) {
description.appendText("with item content: ");
itemTextMatcher.describeTo(description);
}
};
}
Ce que je m'attends à que faire est:
- Obtenir les données de la carte qui est une instance de IconRowAdapter (dont il n'y a qu'un dans l'activité)...
- ... trouver l'entrée à la position 0 à la carte...
- ... utiliser withItemContent() pour vérifier que le texte dans l'élément à cette position correspond à des "Artistes"
Quand je lance que j'obtiens l'erreur suivante:
Caused by: java.lang.RuntimeException: No data found matching: is an instance of
uk.org.ngo.squeezer.IconRowAdapter contained values: <[Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585980 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 0, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b15859e0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 1, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a00 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 2, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a20 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 3, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a40 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 4, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a60 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 5, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a80 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 6, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585aa0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 7, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585ac0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 8, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585ae0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 9, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585b00 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 10, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585b20 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 11]>
Il y a 12 éléments dans IconRowAdapter, donc j'ai peu de confiance qu'il est à la recherche de la bonne carte.
Tous les exemples de code et de la documentation que j'ai pu trouver suppose que vous essayez de trouver une entrée dans l'adaptateur pour cliquer sur elle (et que le résultat sera la valeur de certains autres de vue changement). Je ne trouve rien qui parle de comment comment vérifier la valeur d'un élément donné dans un adaptateur.
Des idées reçues avec reconnaissance.
Modifier pour ajouter:
Ce qui fonctionne est la suivante:
onData(anything())
.inAdapterView(withId(R.id.item_list))
.atPosition(0)
.check(matches(hasDescendant(
allOf(withId(R.id.text1), withText(containsString("Artists"))))));
Si je comprends bien c'est tester la valeur de la R. id.texte1 vue, plutôt que de la valeur de la carte. Je suppose que le sens d'un test de l'INTERFACE utilisateur, mais je suis toujours intéressé à trouver comment faire (si?) Je peux utiliser l'Espresso à tester le contenu d'un élément dans l'adaptateur.
OriginalL'auteur Nik | 2014-12-23
Vous devez vous connecter pour publier un commentaire.
Le comparateur de passé en argument de
onData()
doit correspondre à la valeur retourné parAdapter.getItem()
.Donc, la première version ne correspond pas, du fait d'un mauvais type. Il doit être:
Ce peut aussi être un piège est à l'aide de equalTo sur les différents types de CharSequences. La chaîne est un CharSequence, mais si IconRow.getText() renvoie CharSequence au lieu de String, cela peut également être Spannable, Modifiable, etc, auquel cas equalTo ne correspondent pas. Donc, si IconRow.getText() retourne rien, mais la Chaîne, assurez-vous de le convertir en une Chaîne de caractères avant la comparaison.
OriginalL'auteur haffax
Essayer cela qu'il faut travailler:
Si vous supprimez
atPosition(0)
, alors vous aurez juste à vérifier la présence de l'adaptateur d'affichage.Avez-vous modifié le matcher?
yep. quelque chose comme ceci
fun withItemContent(expectedText: String): Matcher<Any> { checkNotNull(expectedText) return withItemContent(equalTo(expectedText).toString()) }
OriginalL'auteur denys