如何在Grails中设置功能测试的测试数据?

时间:2015-12-03 01:06:29

标签: unit-testing grails integration-testing functional-testing spock

因此,我们希望使用grails中的restclient进行测试。

测试代码应该是这样的......

class MyControllerSpec extends Specification {

def setup() {
  this.dbEntity = new DbEntity("someid123").save();
}

void "Test entity GET"{
        given:
            RestBuilder rest = new RestBuilder()

        when: "The DB entity service is hit"
            RestResponse restResponse = rest.post("http://localhost:8080/api/someentity/$id");

        then: "A 200 error is sent"
            restResponse.status == 200


}

我遇到的问题是设置方法在.save()上爆炸,因为没有hibernate会话。如何在运行测试之前操作我的数据库?

4 个答案:

答案 0 :(得分:0)

您可以定义名为" setupData"的方法,并在"给定"中调用它。 "测试实体GET"测试用例。

def setupData() { this.dbEntity = new DbEntity("someid123").save(); }

答案 1 :(得分:0)

如果需要在每个功能测试之前加载一些数据,可以使用@Shared变量或方法或两者创建辅助类。即使您可以覆盖该类中的setup,setupSpec方法。

你的第一堂课现在不扩展规范,而不是扩展DataLoader类(辅助类)。

class MyControllerSpec extends DataLoader {

    void setup(){
        createEntity()
    }


    void "Test entity GET"{
            given:
                RestBuilder rest = new RestBuilder()

            when: "The DB entity service is hit"
                RestResponse restResponse = rest.post("http://localhost:8080/api/someentity/$dbEntity.id");

            then: "A 200 error is sent"
                restResponse.status == 200

    }
}

你的助手类是扩展规范的方法,它的方法和@Shared变量。

import spock.lang.Shared

class DataLoader extends Specification {

    @Shared DbEntity dbEntity

    void createEntity(){
        dbEntity = new DbEntity("someid123").save();
    }

}

答案 2 :(得分:0)

在Grails 2.5.6中扩展GebSpec时,其他答案都无济于事:我仍然会得到

  

类[...]上的方法在Grails应用程序之外使用了

save()通话中。

@TestFor(DbEntity)添加到测试类中有帮助。

NB:尽管该注释破坏了集成测试,但这里似乎很有必要。不知道为什么会这样。

答案 3 :(得分:0)

您可能想使用remote-control插件。在Grails 2.x中,将其添加到您的BuildConfig.groovy

repositories {
    ...
    mavenRepo "http://dl.bintray.com/alkemist/maven/"
}

plugins {
    ...
    test ":remote-control:2.0"
}

刷新依赖关系并可能调整了一些设置(例如,参见herehere)后,您可以像在测试中那样使用它:

// <project>/test/functional/<package>/MyControllerSpec.groovy
class MyControllerSpec extends GebSpec {

    RemoteControl remote        

    DbEntity dbEntity

    def setup() {
        this.remote = new RemoteControl()           

        this.dbEntity = remote {
            new DbEntity("someid123").save()
        }
    }

    def cleanup() {
        remote {
            DbEntity.findAll().each { dbe ->
                println("Deleting $dbe")
                dbe.delete()
            }
        }
    }

注意:

  • 您还可以在remote / givensetup块中调用when
  • 有时,似乎有必要在remote { ... }的{​​{1}}中包装核心。也许对于更聪明的人来说是显而易见的。我迷迷糊糊了。
  • 如果您要从DbEntity.withTransaction { ... }返回DbEntity,则它必须可序列化。