2014-09-13 63 views
1

我目前遇到的问题是使用grails 2.4.2验证spock中的约束消息。在测试时,我不断收到默认的错误消息,而不是我的自定义消息。但是,当我打印到使用Grails错误标签的视图时,我收到了正确的错误消息。我甚至从message.propperties中删除了默认值。 这里是我的规格是什么样子:Grails:使用spock测试约束错误消息

import com.fishLogger.user.User 
import com.fishLogger.DomainErrorHandling 

import grails.test.mixin.TestFor 
import org.springframework.context.MessageSource 
import spock.lang.Specification 

/** 
* See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage  instructions 
*/ 
@TestFor(User) 
class UserSpec extends Specification { 
MessageSource messageSource 

def setup() { 
    DomainErrorHandling.enable(new User()) 
} 

def cleanup() { 
} 

void "test Invalid User Name Errors"(){ 
    when: 
    User user = new User(userName:userName, password:password, email:email) 
    //user.errors.allErrors.get(0).code 
    user.validate() 
    then:  
    user.errorMessage()==expectedMessage 


    where: 
    userName    | password   | email     | expectedMessage 
    ""      |"vailidPassword" | "[email protected]" | "User name must be entered" 
    //"asd"     |"vailidPassword" | "[email protected]" | "User name must be atleast 6 chacters long" 
    //" "      |"vailidPassword" | "[email protected]" | "User name must be entered" 
    //"aaaaaaaaaaaaaaaaaaaaa" |"vailidPassword" | "[email protected]" | "User name can not be greater than 20 characters" 
} 

启用其中一个电话加载帮助方法域抢错误信息

class DomainErrorHandling { 

public static void enable(Object obj){ 
    obj.class.metaClass.errorMessage = { 
     MessageSource messageSource = Holders.applicationContext.getBean("messageSource") 
     def errorString = delegate?.errors?.allErrors?.collect{error -> 
      messageSource.getMessage(error,Locale.default) 
      }?.join(' \n') 
     return errorString 
     } 
} 
} 

任何帮助或指导将是巨大的。我知道测试错误消息应该更多的是UI测试,但我真的更愿意用我的单元测试来测试它们。

回答

-1

至于为什么当您从message.properties中删除旧消息时,请检查MessageSourceResolvable中的getDefaultMessage()。我猜测你的自定义消息对于测试是不可见的,或者是因为它的关键字拼写错误或者一些Grails测试引导程序问题。

我会尝试在errorMessage()方法中打印出错误的getCodes(),并查看列出的任何代码是否是message.properties中的一个自定义密钥的密钥。

-1

假设Book域类与非可空name属性,你可以做到以下几点:

@Mock(Book) 
class BookSpec extends Specification { 
    StaticMessageSource messageSource 

    def setup() { 
     messageSource = (StaticMessageSource)grailsApplication.mainContext.getBean('messageSource') 
    } 

    def "check name validation error message"() { 
     given: 
     messageSource.addMessage ("nullable.name", Locale.default, "Null!") 
     Book book = new Book (name:null) 

     when: 
     book.validate() 

     then: 
     messageSource.getMessage (book.errors.getFieldError ('name'), Locale.default) == "Null!" 
    } 
}