2015-11-22 1 views
3

Я работаю с:Спок и Спок отчеты: Как напечатать переменной ценен в Этикетка/Block

  • Спок Ядро
  • Спок Отчеты
  • Спок Spring
  • Spring MVC Testing

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

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 в Спок «s ярлык/блок? как (данный, тогда ...)? Он будет напечатан через Спока Reports и улучшить мое тестирование документации

Я прочитал следующее: Spocklight: Extra Data Variables for Unroll Description

Он работает около @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 и в этом методе испытания. Я не хочу вручную обновлять текст в метке/блоке given

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

ответ

1

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

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

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] 
} 

Еще более Hacky способом было бы напечатать url только через println url - этот выход захватывается также AFAIK, но это не было бы как приятно.

Update:, пожалуйста, посмотрите на следующий Спока сценарий консоли: 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, это также будет отражено в текстах различных тестовых блоков при распечатке через отчеты-споты.

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

Помогает ли это?

+0

Я протестировал ваше решение, оно не работает. Во-первых, я получаю сообщение об ошибке «Я не могу объявить' когда »после последнего' then'. И переменная всегда равна нулю. –

+0

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

+0

спасибо !. Есть две проблемы (1) 'where' не могут использоваться после' then'. (2) ваш 'url <<' всегда терпит неудачу из-за * NullPointer ... * и что-то связанное. –