仅针对测试数据覆盖 Grails dateCreated 和 lastUpdated?
Posted
技术标签:
【中文标题】仅针对测试数据覆盖 Grails dateCreated 和 lastUpdated?【英文标题】:Override Grails dateCreated and lastUpdated for test data only? 【发布时间】:2012-11-11 01:28:08 【问题描述】:我有几个 Grails 2.1 域类,包括 GORM 自动管理的 dateCreated
和 lastUpdated
字段,例如:
class Person
Date dateCreated
Date lastUpdated
String name
我想要 Grails 在运行时自动填写这些字段,但我也想要创建一些测试数据,我可以在其中手动定义这些日期的值。问题在于,如果这些字段带有拦截器,即使我专门设置了它们,Grails 也会自动设置这些值。
我见过this SO question,它描述了如何允许更改dateCreated
,但我也需要更改lastUpdated
。这可能吗?
【问题讨论】:
您是否尝试过使用其他方法?我认为它不起作用? @tim_yates,问题中链接的方法允许我手动设置dateCreated
字段,但不能手动设置lastUpdated
字段。
你测试了吗?它似乎禁用了所有时间戳,因此包含 lastUpdated。
@DanVinton 你得到什么错误?还是像往常一样设置lastUpdated
字段?
【参考方案1】:
哎呀,我的错误,另一个问题中的方法确实有效,但是有问题的实体被单独保存在其他地方。您似乎还需要一个明确的flush
才能使事情正常进行:
def withAutoTimestampSuppression(entity, closure)
toggleAutoTimestamp(entity, false)
def result = closure()
toggleAutoTimestamp(entity, true)
result
def toggleAutoTimestamp(target, enabled)
def applicationContext = (ServletContextHolder.getServletContext()
.getAttribute(ApplicationAttributes.APPLICATION_CONTEXT))
def closureInterceptor = applicationContext.getBean("eventTriggeringInterceptor")
def datastore = closureInterceptor.datastores.values().iterator().next()
def interceptor = datastore.getEventTriggeringInterceptor()
def listener = interceptor.findEventListener(target)
listener.shouldTimestamp = enabled
null
def createTestPerson()
def luke = new Person(name: "Luke Skywalker")
withAutoTimestampSuppression(luke)
def lastWeek = new Date().minus(7)
luke.dateCreated = lastWeek
luke.lastUpdated = lastWeek
luke.save(failOnError: true, flush: true)
【讨论】:
【参考方案2】:如果是集成测试可以使用hql update语句手动设置lastUpdated。
【讨论】:
以上是关于仅针对测试数据覆盖 Grails dateCreated 和 lastUpdated?的主要内容,如果未能解决你的问题,请参考以下文章
IntelliJ IDEA 的零覆盖:带有 Spock 单元测试的 Grails