список собирать не работает, когда только умножить выражение на тесте спилка Grails - PullRequest
0 голосов
/ 04 октября 2018

Я создаю тестовый код для сбора списка

import spock.lang.Specification

class CollectTest extends Specification {

  void "test collect"() {
    when:
    def list = [
      [
        name     : 'name1',
        amount   : 1,
        unitPrice: 1000
      ],
      [
        name     : 'name2',
        amount   : 2,
        unitPrice: 2000
      ],
      [
        name     : 'name3',
        amount   : 3,
        unitPrice: 3000
      ]
    ]

    then:
    [1 * 1000, 2 * 2000, 3 * 3000] == list.collect { it.amount * it.unitPrice }
  }
}

почему произошла ошибка этого кода, возможно, замыкание может иметь только выражение?

это журнал консоли ошибок

Условиеошибка с исключением:

[1 * 1000, 2 * 2000, 3 * 3000] == list.collect {it.amount * it.unitPrice} ||||1000 4000 9000 groovy.lang.MissingPropertyException: Нет такого свойства: список для класса: com.seojin.api.lang.CollectTest Возможные решения: class

at com.seojin.api.lang.CollectTest.test collect(CollectTest.groovy:28)

Причина: groovy.lang.MissingPropertyException: Нет такогосвойство: список для класса: com.seojin.api.lang.CollectTest Возможные решения: класс ... еще 1

then:
[1 * 1000, 2 * 2000, 3 * 3000] == list.collect {
  return it.amount * it.unitPrice
}

then:
[1 * 1000, 2 * 2000, 3 * 3000] == list.collect {
  (it.amount * it.unitPrice) as Long
}

хорошо работает этот код, почему?Зачем мне "возвращаться"?

1 Ответ

0 голосов
/ 04 октября 2018

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

def "test collect"() {
    when:
    def result = amount * unitPrice
    then:
    result == expectedResult
    where:
    amount | unitPrice | expectedResult
    1      | 1000      | 1000
    2      | 2000      | 4000
    3      | 3000      | 9000
}

Это перебирает каждую строку в таблице в where и запускает тест для значений.

Чтобы улучшить вывод, вы можете добавить аннотацию @Unroll, например, так:

@Unroll("Given I have #amount units with a price of #unitPrice each, then I should have a total amount of #expectedResult")
def "test collect"() {
    when:
    def result = amount * unitPrice
    then:
    result == expectedResult
    where:
    amount | unitPrice | expectedResult
    1      | 1000      | 1000
    2      | 2000      | 4000
    3      | 3000      | 9000
}

Когда вы запустите эти тесты в IDE, вы получите разные выходные данные для каждоготест с другим названием.

Стоит взглянуть на документацию spock , чтобы узнать, что еще может сделать этот фреймворк.

...