2

私はこのオブジェクトを持っています

@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に従って動作するはずです:「コレクションまたは数値プロパティの最小サイズを設定します。」

4

2 に答える 2

7

ドキュメントは誤解を招く可能性があります。minSize 制約は以下にのみ適用されます。

  1. 配列
  2. 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());
    }

これに対して独自のカスタム制約を開発するか、Thermech が提案するカスタム バリデーターを開発できます。

さらに、Grails で validate メソッドを適切にモックするには、テスト クラスを次のようにする必要があります。

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

        foo.items = [:]

        assert !foo.validate()
    } }
于 2013-03-18T20:47:53.790 に答える
1

私が見つけた唯一の方法は、カスタムバリデータを使用することです:

static constraints = {
    items validator:  { Map map, obj, errors ->
        if (map.size() < 1) errors.rejectValue('items', 'minSize.notmet')
    }
}
于 2013-03-18T19:11:11.210 に答える