2010-05-27 1 views
4

컨트롤러 작업에서 명령 개체를 사용하는 컨트롤러가 있습니다. 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 
    }) 
} 
} 
+1

나는 그것을 얻었다. 테스트 할 액션에 "form"객체를 전달하기 전에 form.validate()를 호출해야했습니다. 메모로 ... 농담 해?! 심각하게 ... 프레임 워크 자체에서 자동으로 유효성 검사를 호출하지만 테스트 케이스에서는이를 수행해야합니까? 이것은 생산 단계 에서처럼 작동 할 수 있습니까? 규칙을 예외로 한 다음 규칙을 예외로 설정하면 예외가 적용됩니다. ARG! Grails에서의 테스트는 짜증납니다. 그것은 나쁘다. 원시 스프링에서하는 것이 더 쉽습니다. – egervari

+1

나는 똑같은 문제가 있었고 귀하가 귀하의 코멘트에 게시했지만 더 나은 방법을 찾았을 때 검증을 요청했습니다. setUp() mockCommandObject RegistrationForm을 입력 한 다음 RegistrationForm .metaClass.hasErrors() {! delegate.validate()}를 종료하고 GroovySystem.metaClassRegistry.removeMetaClass RegistrationForm을 종료합니다. – jjczopek

답변

1

: 당신은 내가 사용하고있는 제약을 볼 수 있도록 여기에

/는 RegistrationForm 클래스입니다 : 내 테스트는 기본적인 것은 작동하지 않을 경우 경우 신뢰할 수있는 하나가 될 수있는 방법을 모른다 mockForConstraintsTests을 사용해 보셨습니까?

예. 뭔가 같은 ...

void testSomething() { 

    mockForConstraintsTests(RegistrationForm) 

    def form = new RegistrationForm(emailAddress: "[email protected]", password: "secret", confirmPassword: "wrong") 

    form.validate() 

    assert 1 == form.errors.getErrorCount() 
} 

는 자신의 단위 테스트에 먼저 RegistrationForm 명령 개체를 테스트 해보십시오. (실제로 자신이 일한다는 확신을 얻으십시오)

아마도 위의 테스트를 기반으로 위의 방법을 사용하면 도움이 될 것입니다!

+0

mockForConstraintsTest()는 mockCommandObject가하는 일을하는 것처럼 보입니다. 테스트의 setup()에 -a/both를 포함하면 testSomething()이 작동하는 것 같습니다. 내가 그 중 하나도 포함하지 않을 때만 실패합니다. 그렇기 때문에 hasErrors()를 사용하는 다른 테스트는 여전히 true를 반환하지 않습니다. – egervari