2

我们正在为 Grails 2.4 升级做准备。我们面临的问题之一是大多数命令对象单元测试都失败了,因为注入的属性(如服务)在验证期间必须不为空。

有什么建议的方法来测试这个吗?我们是否应该模拟所有属性,尽管测试不需要一些属性?或者有没有办法以不同的方式做到这一点?

在 Jeff 回答了我的问题后,我分享了有关新功能的更多信息的链接:doWithSpring 和 doWithConfig 在 2.4 中的新增功能中进行了简要描述:http ://grails.org/doc/latest/guide/introduction.html#whatsNew24 in单元测试改进部分还有一个 JIRA 问题示例:https ://jira.grails.org/browse/GRAILS-11003

4

1 回答 1

3

大多数单元测试不希望或不需要应用程序上下文全部启动和填充。单元测试可以在应用程序上下文中添加任何他们想要的(或什么都不加)。在最新版本的 Grails 中,您可以执行以下操作...

控制器和命令对象:

// grails-app/controllers/demo/DemoController.groovy
package demo

class DemoController {

    def processName(SomeCommand co) {
        render co.someValue
    }
}

class SomeCommand {
    String name
    def helperService

    def getSomeValue() {
        helperService.processValue(name)
    }
}

一项服务:

// grails-app/services/demo/HelperService
package demo

class HelperService {

    def processValue(String originalValue) {
        "__${originalValue}__"
    }
}

单元测试:

// grails-app/test/unit/demo/DemoControllerSpec.groovy
package demo

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

@TestFor(DemoController)
class DemoControllerSpec extends Specification {

    def doWithSpring = {
        helperService HelperService
    }

    void 'process name'() {
        when:
        params.name = 'Jeff'
        controller.processName()

        then:
        response.contentAsString == '__Jeff__'
    }
}

Grails 2.4.2 将通过该测试。

我希望这会有所帮助。

于 2014-07-19T14:34:43.893 回答