2016-06-14 31 views

答えて

16

また、以前の状態に応じて、チェックボックス/スイッチを切り替えたいと思っていました。

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

...と、これがONしたチェックボックスをOFFトグルする:

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

しかし、これは動作しませんを最初に、私はこれがOFFしたチェックボックスを切り替えてみましたエスプレッソはアクションを実行する前に特定のトグル状態を探しているためです。場合によっては、事前にオンかオフかを知らないこともあります。

私の解決策は、カスタムViewActionを使用して、以前の状態に依存しないチェック可能なオブジェクト(スイッチ、チェックボックスなど)をオフ/オンにすることです。それで、すでにONになっていれば、ONのままになります。 OFFの場合はONになります。ここ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が自分のチェックボックスでサポートされていないことを伝えるエラーが発生したため、「scrollTo()」のViewActionを削除するだけでした。表示されているように、私はチェックボックスに "globalSearch"の値を設定したいと思った。 – yvolk

+0

私は、チェックボックスの現在の状態のチェックを追加し、それを変更して答えを更新しました。(グローバル設定) (checkableView.isChecked()!=チェックされている){ { 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

をGoogleによると、それがどのようにエスプレッソ作品に反します非常に危険ですhttps://youtu.be/isihPOY2vS4?t=4m12s –

1

を試してみてくださいこれは、チェックボックスをチェックする必要があることを、あなたのテストの一部であるように思われます。これが失敗した場合、あなたのテストは、あなたのケースでは良いことかもしれない、失敗します

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

あなたがすることによってこれを確認することができます。次に、このケースが一致した後に、あなたが望むクリックを実行することができます。

これがあなたが望む状況でない場合、このエスプレッソテストで何をしようとしているかもっと説明できますか?

+0

私は自分のテストを行う前にチェックボックスがチェックされていることを確認します。それがチェックされない理由は、別のテストでチェックが外されたためです。 – kyrax

+0

エスプレッソはビューの状態を設定したり、ビューを操作することはできません。あなたのテストを構造化する他の方法がない場合、以前の答えはうまくいくでしょうが、エスプレッソの慣習に反します。テストを構造化してモジュール化して、ビューを操作する必要がないようにすることをお勧めします。@kyrax –

+0

@kyraxエスプレッソテストでのアクティビティを使用することは非常に悪いことがわかっているので、私の答えは受け入れられますか? –

0

私は同じ問題を抱えていたANいつも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); 
    } 
} 

のチェックを外し自身ViewActionを書き、このようにそれを使用:今私が見つけスイッチが常にあることを確認することができます

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

以前にチェックされているかどうかに関係なく、チェックされていません。

関連する問題