unit-testing - Grails:使用 spock 测试约束错误消息

标签 unit-testing grails groovy error-handling spock

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

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"   | "thisworks@email.com" | "User name must be entered"
    //"asd"                 |"vailidPassword"   | "thisworks@email.com" | "User name must be atleast 6 chacters long"
    //" "                       |"vailidPassword"   | "thisworks@email.com" | "User name must be entered"
    //"aaaaaaaaaaaaaaaaaaaaa"   |"vailidPassword"   | "thisworks@email.com" | "User name can not be greater than 20 characters"
}

其中 enable 是将帮助方法加载到域以获取错误消息的调用
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 测试,但我真的更喜欢用我的单元测试来测试它们。

最佳答案

至于为什么从message.properties中删除它时仍然显示旧消息,请查看MessageSourceResolvable中的getDefaultMessage()。我猜您的自定义消息对测试不可见,要么是因为它的键拼写错误,要么是一些 Grails 测试引导问题。

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

关于unit-testing - Grails:使用 spock 测试约束错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25824474/

相关文章:

java - 如何在 Grails 中配置 Spring-Security-LDAP 插件以使用 TLS?

groovy - 如何从 groovy 中的 json 对象获取值

hibernate - 是否可以在我的 grails 应用程序上自定义 hibernate-plugin 自动生成的 CRUD 方法?

xml - Groovy XmlSlurper 和插入子节点

c++ - 在已在共享库中实现的可执行文件中实现静态方法是否安全?

android - 单元测试 Android Mockito 中的 Intent extras

unit-testing - 在测试驱动开发中重构时添加测试

java - JUnit如何测试多个函数

grails - 如何在Eclipse中更改Grails版本?

ruby-on-rails - Rails 没有 ActiveRecord 的好处,Grails 没有 GORM