컨트롤러 작업에서 명령 개체를 사용하는 컨트롤러가 있습니다. grails '컨트롤러 유닛 테스트에서이 명령 객체를 조롱 할 때 hasErrors() 메서드는 의도적으로 제약 조건을 위반하더라도 false를 반환합니다. 생산 과정에서 hasErrors()가 작동한다는 것이 더 당황 스럽습니다. 이것은 단지 테스트 문제 일뿐입니다. 테스트 자체에 grails 컨트롤러의 조롱 명령 객체는 결과에 상관없이 hasErrors()를 반환합니다! 제발 도와주세요
def save = { RegistrationForm form ->
if(form.hasErrors()) {
// code block never gets executed
} else {
// code block always gets executed
}
}
, 나는이 작업을 수행 :
mockCommandObject(RegistrationForm)
def form = new RegistrationForm(emailAddress: "[email protected]",
password: "secret", confirmPassword: "wrong")
controller.save(form)
것은 내가 의도적으로 그것을 나쁜 이메일 주소를 제공하고, 내가 암호를 확인하고 오전과 confirmPassword 특성이 다릅니다. 이 경우 hasErrors()는 true를 반환해야하지만 그렇지 않습니다.
class RegistrationForm {
def springSecurityService
String emailAddress
String password
String confirmPassword
String getEncryptedPassword() {
springSecurityService.encodePassword(password)
}
static constraints = {
emailAddress(blank: false, email: true)
password(blank: false, minSize:4, maxSize: 10)
confirmPassword(blank: false, validator: { confirmPassword, form ->
confirmPassword == form.password
})
}
}
나는 그것을 얻었다. 테스트 할 액션에 "form"객체를 전달하기 전에 form.validate()를 호출해야했습니다. 메모로 ... 농담 해?! 심각하게 ... 프레임 워크 자체에서 자동으로 유효성 검사를 호출하지만 테스트 케이스에서는이를 수행해야합니까? 이것은 생산 단계 에서처럼 작동 할 수 있습니까? 규칙을 예외로 한 다음 규칙을 예외로 설정하면 예외가 적용됩니다. ARG! Grails에서의 테스트는 짜증납니다. 그것은 나쁘다. 원시 스프링에서하는 것이 더 쉽습니다. – egervari
나는 똑같은 문제가 있었고 귀하가 귀하의 코멘트에 게시했지만 더 나은 방법을 찾았을 때 검증을 요청했습니다. setUp() mockCommandObject RegistrationForm을 입력 한 다음 RegistrationForm .metaClass.hasErrors() {! delegate.validate()}를 종료하고 GroovySystem.metaClassRegistry.removeMetaClass RegistrationForm을 종료합니다. – jjczopek