我有以下测试(这可能更像是功能测试而不是集成,但是......):
@Integration(applicationClass = Application)
@Rollback
class ConventionControllerIntegrationSpec extends Specification {
RestBuilder rest = new RestBuilder()
String url
def setup() {
url = "http://localhost:${serverPort}/api/admin/organizations/${Organization.first().id}/conventions"
}
def cleanup() {
}
void "test update convention"() {
given:
Convention convention = Convention.first()
when:
RestResponse response = rest.put("${url}/${convention.id}") {
contentType "application/json"
json {
name = "New Name"
}
}
then:
response.status == HttpStatus.OK.value()
Convention.findByName("New Name").id == convention.id
Convention.findByName("New Name").name == "New Name"
}
}
数据是通过 BootStrap 加载的(这可能是问题),但问题是当我在then
块中时;它Convention
通过新名称和id
匹配项找到 ,但是在测试该name
字段时,它失败了,因为它仍然具有旧名称。
在阅读有关测试的文档时,我认为问题在于数据是在哪个会话中创建的。由于@Rollback
有一个与 分开的会话BootStrap
,因此数据并没有真正凝胶化。例如,如果我通过测试given
块加载数据,那么当我的控制器被RestBuilder
.
我完全有可能不应该以这种方式进行这种测试,因此我们非常感谢您的建议。