因此,我们希望使用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会话。如何在运行测试之前操作我的数据库?
答案 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"
}
刷新依赖关系并可能调整了一些设置(例如,参见here和here)后,您可以像在测试中那样使用它:
// <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
/ given
和setup
块中调用when
。remote { ... }
的{{1}}中包装核心。也许对于更聪明的人来说是显而易见的。我迷迷糊糊了。DbEntity.withTransaction { ... }
返回DbEntity
,则它必须可序列化。