2016-06-14 87 views

回答

16

我也想切换一个复选框/开关取决于它的以前的状态。起初,我想这要开启一个复选框,为OFF:

onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click()); 

...这切换OFF一个复选框,为ON:

onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click()); 

然而,这不起作用,因为Espresso会在执行动作之前寻找特定的切换状态。有时候,你不知道事先是打开还是关闭。

我的解决方案是使用自定义的ViewAction来关闭/打开任何不依赖于以前状态的可检查对象(开关,复选框等)。所以,如果它已经打开,它将保持开启。如果它关闭,它会打开。这里的ViewAction这一:

public static ViewAction setChecked(final boolean checked) { 
    return new ViewAction() { 
     @Override 
     public BaseMatcher<View> getConstraints() { 
      return new BaseMatcher<View>() { 
       @Override 
       public boolean matches(Object item) { 
        return isA(Checkable.class).matches(item); 
       } 

       @Override 
       public void describeMismatch(Object item, Description mismatchDescription) {} 

       @Override 
       public void describeTo(Description description) {} 
      }; 
     } 

     @Override 
     public String getDescription() { 
      return null; 
     } 

     @Override 
     public void perform(UiController uiController, View view) { 
      Checkable checkableView = (Checkable) view; 
      checkableView.setChecked(checked); 
     } 
    }; 
} 

这里是你如何使用它(在这个例子中,当你想切换到ON):不建议

onView(withId(R.id.toggle)).perform(scrollTo(), setChecked(true)); 
+0

这应该是可以接受的答案! – jakubbialkowski

+0

完美,谢谢@FrostRocket 我不得不改变的唯一的事情是删除“scrollTo()”ViewAction,因为我的错误是我的复选框不支持scrollTo: 'onView(withId(R.id。正如你所看到的,我想将复选框设置为提供的“globalSearch”的值var – yvolk

+0

我更新了答案,添加了对复选框当前状态的检查并将其更改仅当其状态不是必要时才能避免不必要的事件: 'if(checkableView.isChecked()!= checked){ checkableView.setChecked(checked); }' – yvolk

0

你有这样的事情在你的代码:

@Rule 
public ActivityTestRule<ActivityMain> ActivityMainRule = new ActivityTestRule<>(ActivityMain.class); 

尝试

if (!ActivityMainRule.getActivity().findViewById(R.id.check_box).isChecked()) { 
    onView(withId(R.id.check_box)).perform(click())  
} 
+2

根据谷歌它违背了如何咖啡作品并且是非常危险的https://youtu.be/isihPOY2vS4?t=4m12s –

1

这似乎是你测试的一部分,该复选框需要检查。

您可以通过检查:

onView(withId(R.id.checkbox)).check(matches(not(isChecked()))); 

如果失败,您的测试将失败,这可能是你的情况不错。然后,您可以在此案例匹配后执行所需的点击。

如果这不是你想要的情况,你能解释一下你在这个Espresso测试中想做什么吗?

+0

我想确保复选框在我做测试之前被选中。它可能未被检查的原因是因为另一个测试没有被检查。 – kyrax

+0

Espresso不应该能够以任何方式设置任何视图状态或操纵视图。如果没有其他的方式来构建你的测试,那么以前的答案将会起作用,但是又一次违背了意式咖啡的惯例。我会推荐以一种可以使它们更加模块化的方式来构建测试,以便不必操纵任何视图。@kyrax –

+0

@kyrax你能否接受我的回答,因为应该知道在espresso测试中使用活动非常糟糕。 –

0

我有同样的问题一个写了自己的ViewAction这一始终取消选中我SwitchCompat

class UncheckViewAction implements ViewAction{ 

    @Override 
    public Matcher<View> getConstraints() { 
     return new Matcher<View>() { 
      @Override 
      public boolean matches(Object item) { 
       return isA(SwitchCompat.class).matches(item); 
      } 

      @Override 
      public void describeMismatch(Object item, Description mismatchDescription) { 

      } 

      @Override 
      public void _dont_implement_Matcher___instead_extend_BaseMatcher_() { 

      } 

      @Override 
      public void describeTo(Description description) { 

      } 
     }; 
    } 

    @Override 
    public String getDescription() { 
     return null; 
    } 

    @Override 
    public void perform(UiController uiController, View view) { 
     SwitchCompat scView = (SwitchCompat) view; 
     scView.setChecked(false); 
    } 
} 

,并用它这样的:

onView(withId(R.id.check_box)).perform(new UncheckViewAction()) 

现在我可以肯定的是,发现开关始终未经检查,无论它是否被选中或未被选中。

相关问题