unit-testing - 对具有依赖关系的命令对象的自定义验证器进行单元测试

标签 unit-testing grails service constraints

我有一个用于注册用户的命令对象,我想检查用户的年龄。此命令对象具有服务依赖性。如何测试我的 dateOfBirth 属性的自定义验证器?现在看起来直接取自文档,here .

class RegisterUserCommand {

  def someService

  String username
  String password
  String password2
  String email
  Date dateOfBirth

  static constraints = {
    // other constraints
    dateOfBirth blank: false, validator: {val, obj ->
      return obj.someService.calculateAge(val) >= 18
    }
  }

所以基本上问题是:如何模拟验证器闭包的“obj”参数?

最佳答案

在命令对象上测试验证的最简单方法是使用 GrailsUnitTestCase.mockForConstraintsTests .模拟验证方法将应用于您的命令对象,您只需调用 validate()就像你在测试之外一样。

这是一个如何编写单元测试的示例。 blank约束对日期没有意义,所以我把它改成了 nullable: false .

import grails.test.GrailsUnitTestCase

class RegisterUserCommandTests extends GrailsUnitTestCase {
    RegisterUserCommand cmd

    protected void setUp() {
        super.setUp()
        cmd = new RegisterUserCommand()
        mockForConstraintsTests RegisterUserCommand, [cmd]
    }

    void testConstraintsNull() {
        cmd.dateOfBirth = null
        cmd.someService = [calculateAge: { dob -> 18 }]
        def result = cmd.validate()
        assert result == false
        assert cmd.errors.getFieldErrors('dateOfBirth').code ==  ['nullable']
    }

    void testConstraintsCustom() {
        cmd.dateOfBirth = new Date()
        cmd.someService = [calculateAge: { dob -> 17 }]
        def result = cmd.validate()
        assert result == false
        assert cmd.errors.getFieldErrors('dateOfBirth').code == ['validator.invalid']
    }
}

请注意,您的服务不会在单元测试中被注入(inject)(尽管它会在集成测试中),因此您需要像上面那样模拟它,或者创建一个实例并将其分配给 cmd.someservice .

关于unit-testing - 对具有依赖关系的命令对象的自定义验证器进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5445796/

相关文章:

grails - 无法通过命令行运行Grails 2.3.0 M2

c# - Windows 服务更改/删除注册表值

ruby-on-rails - Rails 测试和 Mocha : How to stub specific model - conditional any_instance?

c# - 使用 Microsoft.Data.SqlClient 2.0 时无法从单元测试加载 DLL 'Microsoft.Data.SqlClient.SNI.x86.dll'

java - 模拟嵌套函数给出了 NPE

python - 如何按计划在后台运行我的 python 脚本?

android - 如何在android上实现类似 "Printer Discover"的服务发现?

unit-testing - Visual Studio 2017 和 Resharper 测试运行程序

mongodb - GORM-获取域类属性的原始DB值

grails - 如何从.gsp文件的形式上传照片,将其保存到某个文件夹并将其链接保存到数据库?