unit-testing - 为什么将空字符串转换为 null 传递给 Grails 2.4.0 中域对象的构造函数?

标签 unit-testing grails groovy spock data-conversion

我是 Groovy 和 Grails 的新手。由于空字符串被转换为 null,Spock 对要测试的域对象进行持久化测试失败。这是代码。
域对象,

class Todo {

    String name
    Date createdDate
    String priority
    String status

    static constraints = {
        priority blank: true
    }

}

Spock 规范,
@TestFor(Todo)
class TodoSpec extends Specification {

    void "test persist"() {
        when:
        new Todo(name: 't1', createdDate: new Date(), priority: "1", status: 'ok').save()
        new Todo(name: 't2', createdDate: new Date(), priority: '', status: 'ok').save()

        then:
        Todo.list().size() == 2
    }

}
grails test-app的结果是
Todo.list().size() == 2
     |      |      |
     |      1      false
     [collab.todo.Todo : 1]
        at collab.todo.TodoSpec.test persist(TodoSpec.groovy:18)

我找到了空字符串 ''在线new Todo(name: 't2', createdDate: new Date(), priority: '', status: 'ok')转换为 null通过调试。谷歌一段时间后,我看到 Grails 中有一个功能可以将 Web 表单中的空字符串转换为 null 以持久化,可以通过配置 grails.databinding.convertEmptyStringsToNull = false 禁用该功能。在 Config.groovy 中。但我不认为 Spock UT 是这种情况。我试过了,但它不像我想的那样工作。

我想知道为什么将空字符串转换为 null 作为传递给构造函数的参数?提前致谢。

最佳答案

现在有点麻烦,但可以很容易地工作。以下测试通过 Grails 2.3.9...

一个域类:

// grails-app/domain/com/demo/Person.groovy
package com.demo

class Person {
    String title
}

配置.groovy:
// grails-app/conf/Config.groovy
grails.databinding.convertEmptyStringsToNull = false

// ...

一个单元测试:
// test/unit/com/demo/PersonSpec.groovy
package com.demo

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(Person)
@TestMixin(grails.test.mixin.web.ControllerUnitTestMixin)
class PersonSpec extends Specification {

    void "test empty string conversion"() {
        when:
        def p = new Person(title: '')

        then:
        p.title == ''
    }
}

关键是将 ContollerUnitTestMixin 应用于测试用例,即使它不是真正测试 Controller 。见 https://jira.grails.org/browse/GRAILS-11136 .

我希望这有帮助。

关于unit-testing - 为什么将空字符串转换为 null 传递给 Grails 2.4.0 中域对象的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24207822/

相关文章:

unit-testing - 当模块未模拟时,如何在 Jest 中模拟导入的命名函数

hibernate - 如何将默认行为设置为Grails的标准?

grails - Grails导出插件-导出Div内容,而不是文档中的类列表

java - Android:测试改造成功、失败

使用 Jasmine 进行测试时,Angularjs 注入(inject) Controller 为空

c# - TDD'ing 时提取类。如何测试新提取的类?

grails - cloudfoundry是否支持grails针对Java 1.7编译的应用程序?

grails - 如何使用字符串数组作为 Grails 域中的成员字段?

java - 与 Grails 类似的 Web 框架,但使用 Java 而不是 Groovy?

gradle - Gradle:无法应用插件[id 'groovy']