Unit testing 当参数具有grailsparametermap属性时,如何测试验证错误?
我正在使用grails,我想断言字段是否有错误。这适用于firstName和lastName,但不适用于address。基本上,以下参数会导致地址上的验证错误,因为对于区域MARIOLAND是不可接受的。断言应该通过,但失败了。也许我提取地址的方法不正确。谢谢你的帮助!谢谢大家!Unit testing 当参数具有grailsparametermap属性时,如何测试验证错误?,unit-testing,grails,integration-testing,grails-2.0,grails-domain-class,Unit Testing,Grails,Integration Testing,Grails 2.0,Grails Domain Class,我正在使用grails,我想断言字段是否有错误。这适用于firstName和lastName,但不适用于address。基本上,以下参数会导致地址上的验证错误,因为对于区域MARIOLAND是不可接受的。断言应该通过,但失败了。也许我提取地址的方法不正确。谢谢你的帮助!谢谢大家! controller.params.putAll( firstName : "asd", lastName : "asd", email : "
controller.params.putAll(
firstName : "asd",
lastName : "asd",
email : "asd@gmail.com",
password : "asd",
address : new GrailsParameterMap([country: 'usa', address1: "24 Willey Mayes Plaza", city: "San Francisco", area: "MARIOLAND", postalCode: "94107"], controller.params.getRequest())
)
def model = controller.create()
def user = model.userInstance
user.validate()
assertTrue user.errors.hasFieldErrors("address")
//the above assertion should pass since MARIOLAND on area of address causes validation error, but it fails
我认为这与以下两个仍然悬而未决的问题有关 及 deepValidate不适用于关联或关联字段。以下是我对您的测试的期望:
import grails.test.mixin.TestFor
import spock.lang.Specification
import grails.test.mixin.TestMixin
import grails.test.mixin.support.GrailsUnitTestMixin
import org.codehaus.groovy.grails.web.servlet.mvc.GrailsParameterMap
@TestFor(UserController)
@TestMixin(GrailsUnitTestMixin)
@Mock([User, Address])
class UserControllerSpec extends Specification {
void setup(){
mockForConstraintsTests User
}
void "test something"() {
given:
controller.params.putAll(
firstName : "asd",
lastName : "asd",
email : "asd@gmail.com",
password : "asd",
address : new GrailsParameterMap([country: 'usa',
address1: "24 Willey Mayes Plaza",
city: "San Francisco",
area: "MARIOLAND",
postalCode: "94107"], controller.request)
)
// Also fails if we set address to params
/*controller.params.address = [
country: 'usa', address1: "24 Willey Mayes Plaza",
city: "San Francisco", area: "MARIOLAND", postalCode: "94107"
]*/
when:
def model = controller.index()
def user = model.userInstance
then:
!user.validate() // FAILS
user.errors.hasFieldErrors("address")
}
void "test address"() {
given:
controller.params.putAll(
new GrailsParameterMap([country: 'usa',
address1: "24 Willey Mayes Plaza", city: "San Francisco",
area: "MARIOLAND", postalCode: "94107"],
controller.params.request) )
when:
def model = controller.address()
def address = model.addressInstance
mockForConstraintsTests Address
then:
!address.validate() // PASSES
address.errors.hasFieldErrors("area")
}
}
class User {
String firstName, lastName, email, password
Address address
static constraints = {
// Tests will pass if address validated explicitly
//address validator: { it.validate() }
}
}
class Address {
String country, address1, city, area, postalCode
static constraints = {
area notEqual: "MARIOLAND"
}
}
class UserController {
def index() {
def user = new User(params)
[userInstance: user]
}
def address(){
def address = new Address(params)
[addressInstance: address]
}
}
您是否使用mockforcontainstest、java.util.List来测试约束?你能添加实际的测试和域类来完成这个问题吗?对不起,我只是在寻找一种像我这样断言语句的方法。i、 我只想选择地址字段并检查它是否有错误。应该有办法的。是的,有办法。请尝试user.address.validate和user.address.errors.hasFieldErrorsarea@USER3256520不幸的是,这不起作用。我得到一个错误:java.lang.NullPointerException:无法在此行user.address.validateGrails的哪个版本上调用null对象上的方法validate?你能把对你的问题的评论也写下来吗?我用的是2.2.0。对不起,你对我的问题的评论是什么意思?