gpt4 book ai didi

testing - 似乎 Groovy 在这两种情况下的行为不同?

转载 作者:行者123 更新时间:2023-11-28 21:06:09 27 4
gpt4 key购买 nike

我有两个这样的域类,第一个是 Manager :

package com.mnm

class Manager {
String name;
static hasMany = [ project : Project, tasks : Tasks ]
static constraints = {
}
}

第二个是 Project:

package com.mnm

class Project {
String projectTitle
String projectDescription
String description
static belongsTo = [ managers: Manager ]
static hasMany = [ tasks : Tasks ]
static constraints = {
}
}

我这样写集成测试(通过使用 Manager 找到 projects 的名称):

 void testCountProject() {
def manager = new Manager(name:'Anto').save()
manager.addToProject(new Project(projectTitle:'Grails'))
manager.addToProject(new Project(projectTitle:'Griffon'))
def noOfProjects = Manager.get(manager.id)
def found = noOfProjects.project.collect { it.projectTitle }
assertEquals(['Grails','Griffon'], found.sort())
}

没有错误,测试通过!但是当我将更多的东西添加到同一个测试中时(现在我正在尝试相反,通过使用 Project 找到 Manager 名称):

 void testCountProject() {
def manager = new Manager(name:'Anto').save()
def project1 = new Project(projectTitle:'Grails').save()
manager.addToProject(project1)
manager.addToProject(new Project(projectTitle:'Griffon'))
def noOfProjects = Manager.get(manager.id)
def found = noOfProjects.project.collect { it.projectTitle }
assertEquals(['Grails','Griffon'], found.sort())
def noOfManager = Project.get(project.id)
def foundManager = noOfManager.managers.collect { it.name }
assertEquals(['Anto'],foundManager)
}

现在我得到这样的错误:

No signature of method: com.mnm.Manager.addToProject() is applicable for argument types: (null) values: [null] Possible solutions: addToProject(java.lang.Object), getProject()

我哪里错了?

提前致谢。

最佳答案

您在这两种情况下都遇到了同样的问题,但第一个不是正确的测试,所以它似乎有效。问题是默认情况下所有属性都不为空,因此当您仅设置 projectTitle 时,您的 Project 实例无法通过验证。

在第一个测试中,您没有重新加载 manager 实例,您仍在使用内存中的实例,因为 get() 使用 Hibernate session 作为一级缓存。如果您刷新并清除 session 以强制它转到数据库,它将失败:

class MyTest extends GroovyTestCase {

def sessionFactory

void testCountProject() {
def manager = new Manager(name:'Anto')
manager.addToProject(new Project(projectTitle:'Grails'))
manager.addToProject(new Project(projectTitle:'Griffon'))
manager.save(flush: true)

sessionFactory.currentSession.clear()

def noOfProjects = Manager.get(manager.id)
def found = noOfProjects.project.collect { it.projectTitle }
assertEquals(['Grails','Griffon'], found.sort())
}
}

第二个失败是因为您在 Project 实例上调用了 save() 并且在验证失败时返回 null。您不需要保存 Project 实例,因为当保存包含 Manager 时它们将被传递保存 - 更标准的模式是您在第一个测试中使用的模式。

您有几个选择。一种是修复验证错误 :) 另一种是检查验证错误。这需要单独的 save() 调用,以便您可以访问非空实例:

def project1 = new Project(projectTitle:'Grails')
project1.save()
if (project1.hasErrors()) {
// handle errors
}
else {
manager.addToProject(project1)
}

第三个是failOnError,验证失败会抛出异常:

def project1 = new Project(projectTitle:'Grails').save(failOnError: true)
manager.addToProject(project1)

关于testing - 似乎 Groovy 在这两种情况下的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7256091/

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