2016-06-14 85 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()) 

現在我可以肯定的是,發現開關始終未經檢查,無論它是否被選中或未被選中。

相關問題