Single Page Действие:
Трудно сказать, не видя примеры кода, но один из способов сделать это, чтобы определить методы для ваших действий (подтвердить, отклонить, снять), как простые методы в вашем класс Page:
class ActionsPage extends Page {
static content = {
//Page content here
}
def confirm(){
//Code to perform confirm action on the page
}
def reject(){
//Code to perform reject action on the page
}
Тогда в классе спецификации вы можете сделать
def "Test confirm action"(){
when: "we go to the actions pages"
to ActionsPage
and: "we perform a confirm action"
confirm()
then: "something happens"
//Code which checks the confirmation worked
}
Это работает, потому что Геб использует метод Groovy, отсутствующий материал, чтобы найти имя метода на текущей странице под названием «confirm()» и выполнит этот код.
Несколько страниц Действия:
Если действия сложны и включают навигации по нескольким страницам, то лучше всего создать абстрактный базовый класс для тестов, которые необходимо выполнить действия:
//Not @Stepwise
abstract class BaseActionsSpec extends Specification {
//Note: don't use Spock when/then blocks in these methods as they are not feature methods
protected void confirm(){
//Code to perform multi-page action
}
protected void reject(){
//Code to perform multi-page action
}
}
Затем распространяющиеся классы:
@Stepwise
class ConfirmActionSpec extends BaseActionsSpec{
def "Test confirm action"(){
when: "we go to the actions pages"
to ActionsPage
and: "we perform a confirm action"
confirm() //calls method in super class
then: "something happens"
//Code which checks the confirmation worked
}
}
Благодарим за ответ. На самом деле эти действия не так просты, но они состоят из потока действий на разных веб-страницах. Вот почему я хотел бы реализовать их в виде отдельных спецификаций, а позже есть возможность каким-то образом включить их в другие спецификации. Можно ли добавить новые функции в спецификации с помощью расширения? – MantasG
Итак, это решение подходит только для действий с одной страницей, поэтому я добавлю еще одно решение, которое будет работать для вас. – jk47
Кстати, аннотация @Stepwise не поддерживает наследование, поэтому, если у вас есть функции в суперклассе , порядок, который они выполняются в отношении функций подкласса, не определен. Мне пришлось написать пользовательское расширение Spock, чтобы получить поведение (проприетарный код, хотя извините), который вы хотите здесь. Я рекомендую просто переместить код действия из функций и в вспомогательные методы, как показано в моем ответе. – jk47