2015-07-15 7 views
4

среды: Grails 2.3.8Grails домена: разрешить нулевой, но не пустой для струнного

У меня есть требование, что пароль пользователя может NULL, но не может быть пустым. Поэтому я определить домен, как это:

class User{ 
    ... 
    String password 
    static constraints = { 
     ... 
     password nullable:true, blank: false 
    } 
} 

Я написал юнит-тест для ограничения:

void "password can be null but blank"() { 
    when: "create a new user with password" 
    def user = new User(password: password) 
    then: "validate the user" 
    user.validate() == result 
    where: 
    password | result 
    "hello"  | true 
    ""   | false 
    null  | true 
} 

«Здравствуй» и нулевые случаи хорошо, но пустая строка («») не: junit.framework.AssertionFailedError: Условие не выполнено:

user.validate() == result 
| |   | | 
| true  | false 
|    false 
app.SecUser : (unsaved) 

    at app.UserSpec.password can be null but blank(UserSpec.groovy:24) 
  • ли обнуляемым OV ошибка пробела: false?
  • Я знаю, что я могу использовать специальный валидатор для выполнения требования, мне любопытно, есть ли лучший способ?
  • Я делаю что-то неправильно?
+0

Какой версии Грааль? Бланк изменен на нуль путем привязки данных в некоторых версиях. –

+0

Я использую Grails 2.3.8. Ответ @Jeff Scott Brown разрешает мою проблему. Я думаю, вы тоже в правильном направлении. Итак, вы имеете в виду в какой-то другой версии, мой вопрос не будет проблемой, не так ли? –

+0

В старых версиях это было не так. Я не помню, как это начиналось когда. Но я сказал то же самое, что сказал Джефф. –

ответ

4

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

void "password can be null but blank"() { 
    when: "create a new user with password" 
    def user = new User() 
    user.password = password 

    then: "validate the user" 
    user.validate() == result 

    where: 
    password | result 
    "hello"  | true 
    ""   | false 
    null  | true 
} 

Я надеюсь, что помогает.

EDIT

Если вы хотите, чтобы отключить преобразование пустых строк в нуль, то вы могли бы сделать что-то вроде этого:

import grails.test.mixin.TestFor 
import grails.test.mixin.TestMixin 
import grails.test.mixin.web.ControllerUnitTestMixin 
import spock.lang.Specification 

@TestFor(User) 
@TestMixin(ControllerUnitTestMixin) 
class UserSpec extends Specification { 

    static doWithConfig(c) { 
     c.grails.databinding.convertEmptyStringsToNull = false 
    } 

    void "password can be null but blank"() { 
     when: "create a new user with password" 
     def user = new User(password: password) 

     then: "validate the user" 
     user.validate() == result 

     where: 
     password | result 
     "hello" | true 
     ""  | false 
     null  | true 
    } 
}