2013-09-25 4 views
3

Можно ли передать значение в том месте, где этот блок.Передача значения в где: блок в тесте Spock

Я пробовал это. Но он терпит неудачу и дает MissingPropertyException.

И я хочу, чтобы имя1 и name2 находились внутри метода.

def "length of names #name"() {  
     def name1 = "Spock" 
     def name2 = "Java" 

     expect: 
      name.size() == length 

     where: 
      name  || length 
      name1  || 5 
      name2  || 2 
    } 

ответ

5

Попробуйте это:

def "test length of names"() { 
    expect: 
     name.size() == length 
    where: 
    [name,length]<<getTestData() 

} 

def getTestData(){ 
     [["Ram" ,3 ] ,["Test" ,4] ] 
    } 

Надежда, что помогает !!!

Благодаря

6

Данные испытаний относятся к тому месту, где он не был жестко закодирован в методе испытания (функции).

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

Спок использует Groovy магию, чтобы превратить

def "test length of names"() { 
    expect: 
     name.size() == length 
    where: 
     name  | length 
     "Spock" | 5 
     "Java" | 4 
} 

во что-то примерно как

def test_length_of_names(name, length) { // note the arguments 
    assert name.size() == length 
} 

, а затем говорит тест бегун назвать тест один раз для каждой строки в ИНЕКЕ

test_length_of_names("Spock", 5) 
test_length_of_names("Java", 4) 

Этот подход

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

Это объяснение не содержит нескольких деталей, таких как создание экземпляра спецификации для каждого теста, обновление имени каждого вызова теста и вызов различных методов настройки и очистки.

Для получения более подробной информации см. the Spock documentation.

+0

Да данные «_where_» находится вне теста функции, но все же как лексические функции макета Спока он _appears_ внутри функции. Кстати, эта ссылка на «Spock documentation» нарушена. Что касается предложения «* where» * - мне нужен механизм для повторного использования данных. (Скажем), что 'Where' был интерфейсом, который позволял' private Where getTestData() {...} 'возвращать таблицу where из примера Anuj. И, конечно же, я бы предпочел иметь аккуратный синтаксис таблицы. Спасибо за очень четкое объяснение. – will

+0

Ссылка на документацию исправлена. Спасибо что подметил это. –

Смежные вопросы