2016-06-14 4 views

ответ

16

Я также хотел переключить флажок/переключатель в зависимости от предыдущего состояния. Сначала я попробовал это для переключения ON флажка, который был OFF:

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

... и это для переключения OFF флажка, который был на:

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

Однако, это не работает , поскольку Espresso будет искать конкретное состояние переключения до того, как оно выполнит действие. Иногда вы не знаете, включен ли он или нет.

Мое решение заключается в использовании пользовательского ViewAction для выключения/включения любого проверяемого объекта (Switch, Checkbox и т. Д.), Который не зависит от предыдущего состояния. Итак, если он уже включен, он останется включенным. Если он выключен, он переключится на 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()» ViewAction, потому что я получил сообщение об ошибке, что scrollTo не поддерживается для моего флажка: 'onView (withId (R.id. global_search)). выполнить (setChecked (globalSearch)); ' Как вы видите, я хотел установить флажок в значение предоставленного« 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

Это не рекомендуется в соответствии с Google это идет вразрез как Espresso работ и очень опасно https://youtu.be/isihPOY2vS4?t=4m12s –

1

Это, кажется, часть теста, что флажок должен быть проверен.

Вы можете проверить это:

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

Если это не удается, ваш тест потерпит неудачу, что может быть хорошо в вашем случае. Затем вы можете выполнить требуемый щелчок после совпадения этого случая.

Если вы не хотите, можете ли вы подробнее объяснить, что вы пытаетесь сделать в этом Тесте Эспрессо?

+0

Я хочу убедиться, что флажок установлен, прежде чем я сделаю свой тест. Причина, по которой он может быть снят, заключается в том, что другой тест оставил его непроверенным. – kyrax

+0

Эспрессо не должен устанавливать любое состояние просмотров или манипулировать представлениями в любом случае. Если нет другого способа структурировать ваши тесты, чем предыдущий ответ будет работать, но снова идет против эспрессо-конвенций. Я бы рекомендовал структурировать ваши тесты таким образом, чтобы сделать их более модульными, поэтому им не нужно манипулировать никакими представлениями[email protected] –

+0

@kyrax Можете ли вы принять мой ответ в качестве принятого, потому что должно быть известно, что использование активности в тестах эспрессо очень плохое. –

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()) 

теперь я могу быть уверен, что найденный переключатель всегда неконтролируемый, независимо от того, был ли он проверен или не установлен ранее.

Смежные вопросы