2014-10-13 1 views
2

В моем приложении некоторые из тестов Geb немного шелушатся, так как мы отключаем HTTP-запрос проверки ajax после изменения каждого поля формы , Если вызов ajax не возвращается достаточно быстро, тест взрывается.Использование NonEmptyNavigator.metaClass.invokeMethod {...}, чтобы ввести короткую паузу после заданного поля

Я хотел проверить простое решение для этого, которое (правильно или неправильно, давайте не будем вдаваться в эту дискуссию здесь ...) заключается в том, чтобы ввести короткие паузы в 100 мсек или после паузы после каждого поля, поэтому я начал искать как &, где я мог бы это сделать.

Похоже, мне нужно добавить Thread.sleep после вызова методов NonEmptyNavigator.setInputValue и NonEmptyNavigator.setSelectValue. Я создал подкласс GebSpec, в который я добавил статический блок инициализации:

static { 
    NonEmptyNavigator.metaClass.invokeMethod = { String name, args -> 
     def m = delegate.metaClass.getMetaMethod(name, *args) 
     def result = (m ? m.invoke(delegate, *args) : delegate.metaClass.invokeMissingMethod(delegate, name, args)) 
     if ("setInputValue".equals(name) || "setSelectValue".equals(name)) { 
      Thread.sleep(100) 
     } 
     return result 
    } 
} 

Однако я добавил некоторый журнал отладки, и я заметил, что когда я исполню свою спецификацию я никогда не ударил этот код. Что я здесь делаю неправильно ...?

+0

Из groovyConsole этот код работает нормально. Может быть, это проблема грааля? – Opal

+0

Yeh Я думал, что, возможно, что-то переписывает мои изменения в метаклассе ... – rcgeorge23

ответ

3

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

  • это сделает ваши тесты значительно медленнее, и это будет болезненным в долгосрочной перспективе, поскольку тесты браузеров медленно в общем
  • будут ситуации (медленный CI, например), где, что 100 мс не будет достаточно, так что по сути вы не вынимая шелушение вы просто каким-то образом ограничивая его

Если вы действительно настаиваете на делать это таким образом, то Геб позволяет использовать custom Navigator implementations. Ваш заказ не пустой Navigator реализация будет выглядеть следующим образом:

class ValueSettingWaitingNonEmptyNavigator extends NonEmptyNavigator { 
    Navigator value(value) { 
     super.value(value) 
     Thread.sleep(100) 
     this 
    } 
} 

Таким образом, нет необходимости обезьяньего патч NonEmptyNavigator и вы сможете избежать каких-либо странных проблем, которые могут вызвать.

Правильное решение должно состоять в том, чтобы выполнить обычную реализацию Module, которая бы переопределила метод Navigator value(value) и использовала waitFor(), чтобы проверить, завершена ли проверка. Наконец, вы обернете все ваши элементы проверенной формы в этом модуле на своих страницах и блоках content. Это означало бы, что вы только ждете, где это необходимо и как можно меньше. Я не знаю, насколько большой ваш пакет, но по мере его роста эти 100 мс превратятся в минуты, и вы будете расстроены тем, насколько медленны ваши тесты. Поверь мне, я был там.

+0

Благодарим вас за подробный ответ. И для чего это стоит, я полностью согласен с вами в добавлении произвольных пауз в тестах ... – rcgeorge23