Nano Hash - криптовалюты, майнинг, программирование

Передача состояния между страницами при использовании geb и spock

В приведенном ниже примере (взято из Книги Геба) мы нажав на кнопку, которая перенесет нас на другую страницу.

class GoogleHomePage extends Page {
    static url = "http://google.com"
    static at = { 
        title == "Google" 
    }
    static content = {
        searchField { $("input[name=q]") }
        searchButton(to: GoogleResultsPage) { $("input[value='Google Search']") }
    }
}

Browser.drive(GoogleHomePage) {
    searchField.value("Chuck Norris")
    searchButton.click()
    assert at(GoogleResultsPage)
    assert resultLink(0).text() ==~ /Chuck/
}

Как мы можем передать состояние при переходе на другую страницу? Например, пользователь выбрал этот язык, и я ожидаю, что на следующей странице страница будет на этом языке. Более общий пример:

import geb.*
import grails.plugin.geb.GebSpec

class GoogleHomePage extends Page {
   static url = "http://google.com"
   static at = { title == "Google" }
   static content = {
       searchField { $("input[name=q]") }
       searchButton(to: GoogleResultsPage, searchTerm:searchField.value()) { $("input[value='Google Search']") }
   }
}

class GoogleResultsPage extends Page {

  def searchTerm

  static at = {
    title == "${searchTerm} - Google Search"
  }
}

class MainFunctionalSpec extends GebSpec {

 def "Google search"() {
   when:
   to GoogleHomePage

   then:
   searchField.value("Chuck Norris")
   searchButton.click()
   assert at(GoogleResultsPage)
 }
}

У этого кода есть 2 проблемы: я получаю «Нет такого свойства: searchField для класса: GoogleHomePage» в searchButton.click() при попытке заполнить searchTerm. Даже если я жестко запрограммирую то, что будет передано, GoogleResultsPage.searchTerm будет нулевым, а утверждение at завершится ошибкой. Любые идеи?

02.09.2010

  • Я мог бы проверить это состояние в моем реальном тесте, но я бы предпочел сохранить это утверждение в модели страницы. 03.09.2010

Ответы:


1

На 0.4 это невозможно. Параметры сопоставления с определениями шаблона становятся параметрами этого шаблона. Более того, шаблоны контента определяются в статическом контексте, но их определения закрытия оцениваются в контексте экземпляра. Конечным результатом является невозможность доступа к состоянию экземпляра с этой точки.

Решение состоит в том, чтобы использовать новые хуки жизненного цикла в версии 0.5:

http://bamboo.ci.codehaus.org/browse/GEB-MASTERDEFAULTS/latest/artifact/Manual/pages.html#lifecycle_hooks

class GoogleHomePage extends Page {
    static url = "http://google.com"
    static at = { title == "Google" }
    static content = {
        searchField { $("input[name=q]") }
        searchButton(to: GoogleResultsPage, searchTerm:searchField.value()) { $("input[value='Google Search']") }
    }

    def onUnload(GoogleResultsPage nextPage) {
        nextPage.searchTerm = searchField.value()
    }
}

class GoogleResultsPage extends Page {
    def searchTerm
    static at = {
        title == "${searchTerm} - Google Search"
    }
}

Это доступно в последних загружаемых версиях 0.5-SNAPSHOT из репозитория моментальных снимков codehaus.

08.09.2010
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..