我正在尝试将一些测试数据插入到我的数据库中,由一个名为 BootStrapTest 的类来完成这项工作。
在我的
BootStrap.groovy
文件中它的名字是这样的
environments {
test {
println "Test environment"
println "Executing BootStrapTest"
new BootStrapTest().init()
println "Finished BootStrapTest"
}
}
但是,当我运行集成测试时,此代码不会执行。我读过集成测试应该引导,所以我很困惑。
我看到了一些侵入性的解决方案,比如修改TestApp.groovy脚本,但我想象有一条通过conf的途径来实现这一点。另请阅读这个问题和这个问题,但不太明白。
也许我误解了一些东西,我在 grails 测试方面遇到了很多麻烦。如果它能带来任何好处,我将使用 IntelliJ Idea 作为 IDE。
所有引导代码都必须从 Init 闭包中调用。所以这个版本应该可以工作:
import grails.util.Environment
class BootStrap {
def init = { servletContext ->
// init app
if (Environment.current == Environment.TEST) {
println "Test environment"
println "Executing BootStrapTest"
new BootStrapTest().init()
println "Finished BootStrapTest"
}
}
def destroy = {
// destroy app
}
}
或者,您可以使用单独的引导文件来插入测试数据,而不是调用 BootStrapTest.init()。 grails-app/conf 文件夹中名为 *BootStrap.groovy 的任何类(例如 TestBootStrap.groovy)都在引导阶段运行。请参阅 http://www.grails.org/Bootstrap+Classes
来自2.0文档:
每个环境引导
当您的应用程序在每个环境的基础上启动时,通常需要运行代码。为此,您可以使用 grails-app/conf/BootStrap.groovy 文件对每个环境执行的支持:
def init = { ServletContext ctx ->
environments {
production {
ctx.setAttribute("env", "prod")
}
development {
ctx.setAttribute("env", "dev")
}
}
ctx.setAttribute("foo", "bar")
}
在 BootStrap.groovy 中你可以尝试这样的事情
if (!grails.util.GrailsUtil.environment.contains('test')) {
log.info "In test env"
println "Test environment"
println "Executing BootStrapTest"
new BootStrapTest().init()
println "Finished BootStrapTest"
} else {
log.info "not in test env"
}
这对我在 1.3.4 上有效:
def init = { servletContext ->
println 'bootstrap'
switch (GrailsUtil.environment) {
case "test":
println 'test'
Person p=new Person(name:'made in bootstrap')
assert p.save();
break
}
}
def destroy = {
}
}
此集成测试通过:
@Test
void testBootStrapDataGotLoaded() {
assertNotNull Person.findByName('made in bootstrap')
}