Как избежать ошибок с нулевым полем в spock for Grails mock

Использование grails 2.2.0 для этого простого домена

class Order {
    static mapping = {table "ticket_order"}

    String foo
}

И связанный тест на спок

@TestFor(Order)
class OrderSpec extends Specification {
def "sensible constraints for order class"() {
    setup:
      mockForConstraintsTests(Order)

      when:
      def order = new Order(
        foo : foo
      )
      order.validate()

      then:
        !order.errors.hasFieldErrors("foo")

      where:
        foo = "bar"

}
}

Я получаю этот вывод

grails> test-app unit: Order -echoOut
| Running 1 spock test... 1 of 1
--Output from sensible constraints for order class--
| Failure:  sensible constraints for order class(uk.co.seoss.presscm.OrderSpec)
|  Condition not satisfied:

!order.errors.hasFieldErrors("foo")
||     |      |
||     |      true
||     org.codehaus.groovy.grails.plugins.testing.GrailsMockErrors: 1 errors
||     Field error in object 'uk.co.seoss.presscm.Order' on field 'foo': rejected value [null];

Может кто-нибудь объяснить, почему я получаю это значение null, правильно ли я установил свойство? Я без особой радости попробовал несколько более простых формулировок этого. Он отлично работает в стандартном модульном тесте.


person Ollie Edwards    schedule 19.02.2013    source источник
comment
Вы пробовали использовать простой тест JUnit? Я предполагаю, что проблема не связана со Споком.   -  person Peter Niederwieser    schedule 21.02.2013


Ответы (1)


Мне кажется, что вы смешиваете стили тестирования, основанного на данных и на взаимодействии. Блок where упоминается только в контексте управляемой данными, а комбинация when / then - в контексте тестирования взаимодействия.

Попробуйте поставить def foo = "bar" вверху теста.

person 34m0    schedule 19.02.2013
comment
when-then можно использовать для любого теста (не только на основе взаимодействия), и он отлично работает вместе с where. - person Peter Niederwieser; 21.02.2013