【问题标题】:Grails bootstrap on integration testsGrails 引导集成测试
【发布时间】:2010-09-10 15:45:07
【问题描述】:

我正在尝试将一些测试数据插入到我的数据库中,为此一个名为 BootStrapTest 的类可以完成这项工作。

在我的BootStrap.groovy 文件中它是这样调用的

environments {
            test {
                println "Test environment"
                println "Executing BootStrapTest"
                new BootStrapTest().init()
                println "Finished BootStrapTest"
            }

        }

但是,当我运行集成测试时,此代码不会执行。我读过集成测试应该引导,所以我很困惑。

我看到了一些侵入性的解决方案,例如modifying the TestApp.groovy script,但我想有一条通过 conf 的道路来实现这一点。还阅读了this SO questionthis one as well,但不太明白。

也许我误解了什么,我在 grails 测试中遇到了很多麻烦。如果它带来了任何东西,我使用 Intelli JIdea 作为 IDE。

任何想法将不胜感激。

提前致谢

【问题讨论】:

    标签: grails integration-testing bootstrapping


    【解决方案1】:

    所有引导代码都必须从 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】:

      来自2.0 documentation

      每个环境引导

      当您的应用程序基于每个环境启动时,通常需要运行代码。为此,您可以使用 grails-app/conf/BootStrap.groovy 文件对每个环境执行的支持:

      def init = { ServletContext ctx ->
          environments {
              production {
                  ctx.setAttribute("env", "prod")
              }
              development {
                  ctx.setAttribute("env", "dev")
              }
          }
          ctx.setAttribute("foo", "bar")
      }
      

      【讨论】:

        【解决方案3】:

        在 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"
        }
        

        【讨论】:

        • 我认为BootStrap.groovy 根本没有被执行。
        • 你做错了其他事情,bootstrap必须在集成测试过程中运行
        【解决方案4】:

        这在 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')
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多