gpt4 book ai didi

grails - 如何在使用 Spock 功能测试 grails 时设置对象

转载 作者:行者123 更新时间:2023-12-02 09:29:17 29 4
gpt4 key购买 nike

我有一个像这样的示例域

class User {
String username
String password

def userHelper

static contraints = {
username(nullable: false, blank: false)
password nullable: false, blank: false, validator: {pwd, userInstance ->
return userInstance.userHelper.validatePassword(pwd)
}
}
}

userHelper 正在由我的 resources.groovy 中的以下内容注入(inject)

beans = {
userHelper(UserHelper)
}

当我从浏览器测试我的应用程序时,一切运行正常。但是,我在尝试为此编写功能测试时遇到异常。

错误提示:无法在 null 对象上调用方法 validatePassword()

因此,我假设在运行功能测试用例时未设置 userHelper

我的测试用例如下所示:

 @TestFor(UserController)
@Mock([User])

class UserControllerSpecification extends Specification {


def "save user" () {
given:
request.contentType = "application/json"
request.JSON = """
{user:
{
username: "somtething"
password: "something"
}
}
"""
when:
controller.save()

then:
User.count() == 1
}
}

更新

Controller :

class UserController {
def userService
def save() {
def user = new User(params?.user)
request.withFormat {
json {
if(user.validate())
userService.processUser()
//do something
else
//do something else
}
}
}
}

问题

  • 如何在运行测试之前在 User 域上设置 userHelper 属性?
  • 在运行所有功能和集成测试用例之前,如何在 Bootstrap.groovy 中运行代码?

最佳答案

您尝试过使用defineBeans吗?由于这是一个单元测试,您必须显式定义 bean。这通常是在 JUnit 中完成的

defineBeans{
userHelper(UserHelper){bean ->
//in case you have other beans defined inside helper
bean.autowire = true
}
}

您可以在设置方法中defineBeans以使其可用于所有测试用例。

@Before
void setup(){
defineBeans{
userHelper(UserHelper){bean ->
//in case you have other beans defined inside helper
bean.autowire = true
}
}
}

更新:

似乎在 spock 的情况下,您可以直接在单元测试中注入(inject) spring bean(扩展规范的测试)

class UserControllerSpecification extends Specification {
def userHelper //injected here in case of spock

def "save user" () {
................
}
}

关于grails - 如何在使用 Spock 功能测试 grails 时设置对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17172482/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com