我的grails应用程序的集成测试在我尝试使用grails dynamic get方法获取域对象时返回一个空对象。 这是我的问题的简化示例。假设我有一个控制器 TrackerLogController ,它使用服务 TrackerLogService 为另一个跟踪器域保存更新的日志域。 域跟踪器:
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
}
Service TrackerLogService保存:
Log saveTrackerLogs( Tracker tracker, String comment) {
Log log = new Log(tracker: tracker, comment: comment)
log.save()
return log
}
所以现在我想为这个服务编写一个Integration-Test但是我不确定我是否应该只为控制器中的简单逻辑编写一个(如果错误,错误页面其他好的页面)我会认为我会为此编写一个Unit测试,并使用Integration-Test来检查数据库中的持久性。
这就是我对Integration-Test所拥有的:
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魔法在没有Mocking的情况下对单元测试似乎不起作用,我想为Ingration-Tests在DB中持久化你可以使用grails魔法。
答案 0 :(得分:3)
除非声明它是“已分配”,否则无法指定id值。因为它现在使用自动增量,所以不使用你的123值。出于安全原因,它实际上被地图构造函数忽略,所以你需要这样做:
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]
}