当我使用grails 2.4.4生成一个控制器和相关的单元测试类时,即使我在populateValidParams()中设置了必要的测试数据后,我也会遇到测试失败.我可以只改变固定的几个最失败的model.personInstance!= NULL(用于一个Person类)model.person!= NULL.我很惊讶这是必要的,但至少它是有效的.
其他测试失败在保存,更新和删除相关测试上,并且因为response.redirectUrl为null 而失败.通过使用调试器逐步执行它,看起来request.withFormat闭包正在访问通配符语句而不是表单/ multipartForm块.我认为生成的单元测试中的request.contentType = FORM_CONTENT_TYPE应该导致代码命中代码的表单/ multipartForm部分.
这是我正在测试的Person域类的代码,它只需要firstName和lastName字段......
域类:
package org.crspta.gohomenotes
import groovy.transform.EqualsAndHashCode
@EqualsAndHashCode()
class Person implements Serializable {
User user
Date dateCreated
Date lastUpdated
String firstName
String middleName
String lastName
String nickname
String emailAddress
String cellPhone
String homePhone
String workPhone
static constraints = {
firstName nullable: false
middleName nullable: true
lastName nullable: false
nickname nullable: true
emailAddress nullable: true, email: true
cellPhone nullable: true
homePhone nullable: true
workPhone nullable: true
user nullable: true
}
@Override
public String toString() {
return "${name}"
}
public String getName() {
def name = "$lastName, $firstName"
if (nickname) {
name += " ($nickname)"
}
return name
}
}
Run Code Online (Sandbox Code Playgroud)
PersonControllerSpec:
@TestFor(PersonController)
@Mock(Person)
class PersonControllerSpec extends Specification {
def populateValidParams(params) {
assert params != null
params["firstName"] = 'Firstname'
params["lastName"] = 'Lastname'
}
Run Code Online (Sandbox Code Playgroud)
失败的单元测试方法,因为response.redirectUrl为null.
void "Test the save action correctly persists an instance"() {
when:"The save action is executed with an invalid instance"
request.contentType = FORM_CONTENT_TYPE
request.method = 'POST'
def person = new Person()
person.validate()
controller.save(person)
then:"The create view is rendered again with the correct model"
model.person != null
view == 'create'
when:"The save action is executed with a valid instance"
response.reset()
populateValidParams(params)
person = new Person(params)
controller.save(person)
then:"A redirect is issued to the show action"
response.redirectedUrl == '/person/show/1'
controller.flash.message != null
Person.count() == 1
}
Run Code Online (Sandbox Code Playgroud)
PersonController save()方法:
@Transactional
def save(Person personInstance) {
if (personInstance == null) {
notFound()
return
}
if (personInstance.hasErrors()) {
respond personInstance.errors, view:'create'
return
}
personInstance.save flush:true
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.created.message', args: [message(code: 'person.label', default: 'Person'), personInstance.id])
redirect personInstance
}
'*' { respond personInstance, [status: CREATED] }
}
}
Run Code Online (Sandbox Code Playgroud)
具体错误信息:
Condition not satisfied:
response.redirectedUrl == '/person/show/1'
| | |
| null false
org.codehaus.groovy.grails.plugins.testing.GrailsMockHttpServletResponse@17134f55
<Click to see difference>
at org.crspta.gohomenotes.PersonControllerSpec.Test the save action correctly persists an instance(PersonControllerSpec.groovy:56)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |