Отчеты Spock & Spock: как распечатать ценную переменную в ярлыке / блоке

Я работаю с:

  • Ядро Спока
  • Spock Reports
  • Спок Спринг
  • Тестирование Spring MVC

и у меня есть следующий код:

def "findAll() Expected"(){

    given: "The URL being used is: /personas/xml/personas"

        url = PersonaUrlHelper.FINDALL;

    when: "When the URL is being calling with a GET"

        resultActions = mockMvc.perform(get(url)).andDo(print())

    then: "something..."

        resultActions.andExpect(status().isOk())
                     .andExpect(content().contentType(RequestMappingProducesJsonUtf8.PRODUCES_JSON_UTF_8))

}

Два наблюдения:

Первый: обратите внимание на given: "The URL being used is: /personas/xml/personas", где значение URL / URI было добавлено вручную.

Два: переменная url была определена как переменная экземпляра, потому что она часто встречается во многих методах тестирования. Поэтому def String url

Мой вопрос:

как я могу отобразить переменную url в метке / блоке Spock? как (учитывая, тогда…)? Его нужно распечатать через Spock Reports и улучшить мою тестовую документацию.

Я прочитал следующее: Spocklight: дополнительные переменные данных для разворачивания Описание

Он работает вокруг @Unroll. Но я реализовал всю работу вокруг метки / блока where.

Я уже пробовал что-то вроде:

given: "The URL being used is: $url"
given: "The URL being used is: ${url}"

И не работает

Я хочу работать с синтаксисом, подобным следующему:

def "findAll() Expected"(){

    url = PersonaUrlHelper.FINDALL;

    given: "The URL being used is: $url"

        …. something

    when: "When the URL is being calling with a GET"

Так какая же может быть правильная конфигурация?

Предположим, я выполняю рефакторинг для PersonaUrlHelper.FINDALL, используемого в некоторых @RequestMapping Spring и в этом методе тестирования. Я не хочу вручную обновлять текст в метке / блоке given

Итак, каков правильный синтаксис?


person Manuel Jordan    schedule 22.11.2015    source источник


Ответы (1)


Быстрый ответ:

Думаю, подход where-block будет правильным. Используйте что-нибудь вроде

where: "When the URL is being calling with a GET"
  url << PersonaUrlHelper.FINDALL

И удалите определение url из теста. Вы сможете использовать переменную url, поскольку она определена в блоке where. И вы сможете ссылаться на него из описания теста как #url:

@Unroll
def "findAll() Expected"(){
    given: "The URL being used is: #url"
        //removed url definition
    when: "When the URL is being calling with a GET"
        resultActions = mockMvc.perform(get(url)).andDo(print())
    then: "something..."
        resultActions.andExpect(status().isOk())
                 .andExpect(content().contentType(RequestMappingProducesJsonUtf8.PRODUCES_JSON_UTF_8))
    where: "When the URL is being calling with a GET"
        url << [PersonaUrlHelper.FINDALL]
}

Еще один более хитрый способ - напечатать url только через println url - этот вывод также фиксируется afaik, но это было бы не так хорошо.

Обновление: обратите внимание на следующий скрипт консоли spock: https://meetspock.appspot.com/script/5146767490285568:

import spock.lang.*

class PersonalUrlHelper {
  final static String FINDALL = 'http://example.com'
}

class MyFirstSpec extends Specification {
  @Unroll
  def "findAll() Expected #url "(){
    given:"The URL being used is: #url"        
    when: "When URL (#url) is assigned to a"        
      def a = url    
    then: "a equals the URL (#url)"        
      a == url
    where: "the URL is fetched from another class or map in this case"        
      url << [PersonalUrlHelper.FINDALL]
  }
}

Я пытался издеваться над вашим сценарием - без вашего кода.

Как видите, содержимое URL-адреса печатается в имени теста. AFAIK, это также будет отражено в текстах различных тестовых блоков при распечатке через spock-отчеты.

Кстати: [] важны, поскольку они превращают возвращаемую строку в список с одним элементом. В противном случае строка будет интерпретироваться как lsit, и тест будет повторять каждый символ.

Это помогает?

person rdmueller    schedule 23.11.2015
comment
Я проверил ваше решение, оно не работает. Сначала я получаю сообщение об ошибке, что я не могу объявить when после последнего then. И переменная всегда равна нулю. - person Manuel Jordan; 25.11.2015
comment
Я только что исправил опечатку - последний блок должен быть where. - Извините. Я также посмотрю, смогу ли я найти время, чтобы проверить свой ответ, чтобы увидеть, есть ли другие проблемы ... следите за обновлениями ... - person rdmueller; 25.11.2015
comment
Благодарность!. Есть две проблемы (1) where нельзя использовать после then. (2) ваш url << всегда выходит из строя из-за NullPointer… и чего-то подобного. - person Manuel Jordan; 26.11.2015
comment
Пожалуйста, обратите внимание на добавленные детали. Что касается NullPointer - я думаю, это результат вашего FINDALL вспомогательного метода. Убедитесь, что он не возвращает null - он должен возвращать список или, если он возвращает один элемент, помещать его в [] скобки, как я сделал в моем примере. - person rdmueller; 26.11.2015
comment
Привет, @rdmueller, теперь твой код работает. Вставьте сюда свой код, чтобы применить свой ответ, насколько правильный. да, фокус был [] - person Manuel Jordan; 29.11.2015
comment
да. FINDALL возвращает одно строковое значение, а не коллекцию / список. - person Manuel Jordan; 29.11.2015
comment
Предложение: включите объяснение о [] в свой пост. Думаю, это ценно для публики. Всем большое спасибо! - person Manuel Jordan; 29.11.2015