gpt4 book ai didi

grails - 在Grails中编写集成测试以测试数据库持久性

转载 作者:行者123 更新时间:2023-12-02 15:02:13 24 4
gpt4 key购买 nike

当我尝试使用grails动态get方法获取域对象时,我的grails应用程序的Integration-Test返回空对象。
这是我的问题的简化示例。假设我有一个 Controller TrackerLogController ,该 Controller 使用服务 TrackerLogService 来为另一个 Tracker 域保存更新的日志域。
域跟踪器:

class Tracker {

int id
String name

static hasMany = [logs: Log]
}

域日志:
class Log {
int id
String comment

static belongsTo = [tracker: Tracker]
}

Controller TrackerLogController保存:
def TrackerLogService

def saveTrackerLog() {

def trackerId = params.trackerId

def trackerInstance = Tracker.get(trackerId)
Log log = TrackerLogService.saveTrackerLogs(trackerInstance, params.comment)
if( log.hasErrors() ){
//render error page
}
//render good page
}

服务TrackerLogService保存:
Log saveTrackerLogs( Tracker tracker, String comment) {
Log log = new Log(tracker: tracker, comment: comment)
log.save()
return log
}

所以现在我想为此服务编写一个集成测试,但是我不确定是否应该只为 Controller 中的简单逻辑编写一个(如果出错,则返回错误页面,否则返回正常页面),我想我会写一个为此进行单元测试,并执行集成测试以检查数据库中的持久性。

这是我的集成测试所需要的:
class TrackerLogServiceTests {

def trackerLogService

@Before
void setUp(){

def tracker = new Tracker(id: 123, name: "First")

tracker.save()

//Now even if I call Tracker.get(123) it will return a null value...
}

@Test
void testTrackerLogService() {
Tacker trackerInstance = Tracker.get(123) //I have tried findById as well

String commit = "This is a commit"

//call the service
Log log = trackerLogService.saveTrackerLogs(trackerInstance , commit)

//want to make sure I added the log to the tracker Instance
assertEquals log , trackerInstance.logs.findByCommit(commit)
}
}

因此,对于此示例,我的trackerInstance将为空对象。我知道Grails魔术似乎无法在没有模拟的情况下用于单元测试,我认为Intigration-Tests可以在数据库中保持持久性,因此您可以使用grails魔术。

最佳答案

您不能指定id值,除非您声明其值为“assigned”。现在它正在使用自动增量,因此不会使用您的123值。实际上出于安全原因, map 构造函数会忽略它,因此您需要执行以下操作:

def tracker = new Tracker(name: "First")
tracker.id = 123

但是它会被自动增量查找覆盖。请改用这种方法:
class TrackerLogServiceTests {

def trackerLogService

private trackerId

@Before
void setUp(){
def tracker = new Tracker(name: "First")
tracker.save()
trackerId = tracker.id
}

@Test
void testTrackerLogService() {
Tacker trackerInstance = Tracker.get(trackerId)

String commit = "This is a commit"

//call the service
Log log = trackerLogService.saveTrackerLogs(trackerInstance , commit)

//want to make sure I added the log to the tracker Instance
assertEquals log , trackerInstance.logs.findByCommit(commit)
}
}

另外,不相关-除非声明为非标准类型,否则请勿声明 id字段。一个字符串。 Grails将它与 version字段一起添加。所有你需要的是
class Tracker {
String name
static hasMany = [logs: Log]
}


class Log {
String comment
static belongsTo = [tracker: Tracker]
}

关于grails - 在Grails中编写集成测试以测试数据库持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11528403/

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