2013-03-18 3 views
2

У меня есть этот объектGrails: Как поставить ограничения MinSize на карте

@Validateable 
class Foo { 
    Map<String, String> items 

    static constraints = { 
     items minSize: 1 
    } 
} 

, но этот тест не в состоянии:

@Test 
void shouldNotValidateIfItemsIsEmpty() { 
    Foo foo = new Foo(items: [:]) 

    assert !foo.validate() 
} 

Что я сделал не так? Предполагается работать согласно grails 'minSize' documentation: «Устанавливает минимальный размер коллекции или номерного имущества».

+0

Просто проверьте, не является ли это проблемой ограничения или объект не проверен: что произойдет, если вы добавите другое поле, отличное от нуля? –

+0

Если я добавлю ограничения «nullable: true» в «items», и я делаю тот же тест с «items: null», сбой проверки недействителен с кодом «nullable» – Thermech

+0

У grails есть проблемы с свойствами и ограничениями «Карта». См. [Этот выпуск] (http://stackoverflow.com/questions/3237393/how-to-adjust-constraints-db-mapping-for-map-within-grails-domain-class) – codelark

ответ

7

документация может ввести в заблуждение. Ограничение MinSize будет применяться только к:

  1. Строка
  2. Массивы
  3. Классы, которые реализует интерфейс java.util.Collection

java.util.Map однако не расширить интерфейс java.util.Collection

См. Метод supports от MinSizeConstraint:

public boolean supports(Class type) { 
     return type != null && (
       String.class.isAssignableFrom(type) || 
       Collection.class.isAssignableFrom(type) || 
       type.isArray()); 
    } 

Вы можете разработать свой собственный custom constraint для этого или пользовательский валидатор как это было предложено Thermech

Кроме того, для того, чтобы Grails издеваться метод Validate правильно тестовый класс, который должен быть что-то вроде:

@TestMixin(ControllerUnitTestMixin) class FooTest { 
    @Test 
    void shouldNotValidateIfItemsIsEmpty() { 
     Foo foo = mockCommandObject Foo 

     foo.items = [:] 

     assert !foo.validate() 
    } } 
1

Единственный способ я нашел, это с валидатора:

static constraints = { 
    items validator: { Map map, obj, errors -> 
     if (map.size() < 1) errors.rejectValue('items', 'minSize.notmet') 
    } 
}