我对Espresso很新,我正在尝试使用自定义适配器测试ListView中的插入,删除和修改。
插入很简单,我只需添加一个新元素并在ListView中找到它以检查它是否已被添加。
但问题是删除,这就是我要做的事情:
我的意思是,我认为在删除之前我需要知道项目的内容,然后再检查该行是否不存在。
我该怎么办?也许我没有在正确的道路上执行此测试,我需要以不同的方式进行测试,但我找不到任何信息。
@Test
public void deleteEdition() {
startActivityWithintent();
// push delete button and delete
onData(anything()).inAdapterView(withId(R.id.listEdition))
.atPosition(1)
.onChildView(withId(R.id.imageDelete))
.perform(click());
// confirm delete
onView(withId(R.id.buttonDelete)).check(matches(isDisplayed()));
onView(withId(R.id.buttonDelete)).perform(click());
// HOW CAN I CHECK THE ELEMENT DOES NOT EXISTS?
// onView(withId(R.id.listEdition))
// .check(matches(not(withText(????))));
}
提前致谢。
答案 0 :(得分:2)
尝试搜索是否没有包含其子项内某个文本的视图,如下所示:
onView(withId(R.id.listEdition))
.check(matches(not(hasDescendant(withText("should not exist")))));
或如果这不起作用,请搜索字符串的部分内容。
onView(withId(R.id.listEdition))
.check(matches(not(hasDescendant(withText(containsString("should not exist"))))));
当我尝试在我的电脑上重现它时,它会起作用。
答案 1 :(得分:0)
将要删除的行的文本存储在属性中,例如“matchedText”
this.matchedText = null;
this.rowCounter = -1;
onView(new Matcher<View>() {
@Override
public boolean matches(Object item) {
boolean matches = withId(R.id.imageDelete).matches(item);
if(matches){
rowCounter++;
if(rowCounter == 5){ // 5 is an example of the index you want to access
View view = (View) item;
matchedText = ((TextView)view.getParent()).getText().toString(); // find the matching view by navigating to the right parent and child to get the text you need
return true
}
return false;
}
return false;
}
@Override
public void describeMismatch(Object item, Description mismatchDescription) {
}
@Override
public void _dont_implement_Matcher___instead_extend_BaseMatcher_() {
}
@Override
public void describeTo(Description description) {
}
}).check(matches(isDisplayed()));
点击删除按钮后,您可以通过以下代码找出该行是否真的被删除:
onView(withId(R.id.listEdition))
.check(matches(not(hasDescendant(withText(this.matchedText)))));