Grails 和 Geb:可重现的删除测试
Grails and Geb: Reproducible deletion test
我想用 Geb、Grails 和 RemoteControl 测试一个简单的 CRUD 删除。
这里是我的简化代码:
test "Delete a book"() {
when:
to BookShowPage // book/show/1
deleteLink.click(BookListPage)
then:
// ...
cleanup:
def remote = new RemoteControl()
remote {
new Book(title:'title').save(failOnError: true, flush: true)
return true
}
}
但是我怎样才能让我的测试重现呢?
如果我重复我的测试,新书将有另一个 id,因此测试失败。
根据 railsdog 的评论,我决定在给定的块中创建一本新书。
这里是正确的代码:
test "Delete a book"() {
given:
def remote = new RemoteControl()
def bookId = remote {
Book book = new Book(title:'title').save(failOnError: true)
return book.id
}
when:
to BookShowPage, bookId // (*)
deleteLink.click(BookListPage)
then:
// ...
cleanup:
remote {
Book book = Book.get(bookId)
if (book) {
// Test fails and we have junk into the db...
book.delete(failOnError: true)
}
return true
}
}
(*) 参见 how to customize Geb page URL。
我想用 Geb、Grails 和 RemoteControl 测试一个简单的 CRUD 删除。
这里是我的简化代码:
test "Delete a book"() {
when:
to BookShowPage // book/show/1
deleteLink.click(BookListPage)
then:
// ...
cleanup:
def remote = new RemoteControl()
remote {
new Book(title:'title').save(failOnError: true, flush: true)
return true
}
}
但是我怎样才能让我的测试重现呢?
如果我重复我的测试,新书将有另一个 id,因此测试失败。
根据 railsdog 的评论,我决定在给定的块中创建一本新书。
这里是正确的代码:
test "Delete a book"() {
given:
def remote = new RemoteControl()
def bookId = remote {
Book book = new Book(title:'title').save(failOnError: true)
return book.id
}
when:
to BookShowPage, bookId // (*)
deleteLink.click(BookListPage)
then:
// ...
cleanup:
remote {
Book book = Book.get(bookId)
if (book) {
// Test fails and we have junk into the db...
book.delete(failOnError: true)
}
return true
}
}
(*) 参见 how to customize Geb page URL。