2012-12-06 6 views
2

사용자 로그인을 위해 일반적인 컨트롤러 흐름을 테스트하려고합니다. 대부분의 로그인 시스템과 마찬가지로 확장 관계가 있으며 Grails 문서는 완전히 쓸모가 없습니다. 실제로 사용되는 전형적인 예가 실제 예와 관련이 없으며 완전한 예입니다.Grails 통합 테스트가 MissingMethodException으로 실패했습니다.

@TestFor(UserController) 
class UserControllerTests extends GroovyTestCase { 
    void testLogin() { 
     params.login = [email: "[email protected]", password: "123"] 
     controller.login() 
     assert "/user/main" == response.redirectUrl 
    } 
} 

컨트롤러가 수행합니다 :

groovy.lang.MissingMethodException : : 방법의 어떤 서명 : 실패하지

def login() { 
    if (!params.login) { 
     return 
    } 
    println("Email " + params.login.email) 
    Person p = Person.findByEmail(params?.login?.email) 
    ... 
} 

immigration.Person

내 시험은 다음과 같습니다 .methodMissing()은 인수 유형에 적용 할 수 있습니다.() 값 : []

올바른 데이터가 println에 표시되지만 메서드를 호출 할 수 없습니다.

테스트 스위트는 호출 된 데이터베이스 트리거가 있기 때문에 전체적으로 모의 객체를 사용할 수 없으므로 테스트를 거쳐야합니다.

기괴한 것은 내가 직접 테스트에서 메서드를 호출하면 작동하지만 컨트롤러에서 호출하는 것이 아니라는 것입니다. 업데이트를

: 나는 Grails의 명령에서 직접 테스트를 재생, 그리고 그것은 @Test 주석 추가 : 나는 성배 테스트 응용 프로그램 -integration의 UserController 그것을 실행하는 경우

@TestFor(UserController) 
    class UserControllerTests extends GroovyTestCase { 
     @Test 
     void testLogin() { 
      params.login = [email: "[email protected]", password: "123"] 
      Person.findByEmail(params.login.email) 
      controller.login() 
     } 
    } 

이 작동을

결과가 올바르게 채워지지 않았지만 응답이 비어 있고 값이 있어야하고 redirectedUrl이 null이고 내용 본문이 비어있어보기가 포함되어 있어도 flash.message가 null입니다.

@TestFor 주석을 제거하면 조금이라도 작동하지 않습니다. '매개 변수'가 존재하지 않는다고 말하는 것은 실패합니다.

다른 테스트에서는 두 가지 방법이 있습니다. 첫 번째 메소드가 실행되고 Person.findAllByEmail()을 찾으면 두 번째 메소드가 실행되고 Person.findAllByEmail을 찾을 수 없으며 비슷한 오류 - 메소드가 없어져 충돌이 발생합니다.

다른 이상한 업데이트 - 응답 객체가 리디렉션을 다시 보내는 것처럼 보이지만 응용 프로그램 baseUrl에는 사용자 컨트롤러가 아닌 것 같습니다.

답변

0

TestFor 주석은 단위 테스트에서만 사용됩니다.이 테스트는 구조를 모의합니다. integration tests에서는 완전한 Grails 환경에 액세스 할 수 있으므로이 모의 객체가 필요하지 않습니다. 따라서 주석을 제거하고 작업해야합니다.

class UserControllerTests extends GroovyTestCase { 
... 
} 
+0

슬프게도 이것은 실제로 만들어진 것보다 나쁘다 - 테스트는 조금이라도 실행되지 않습니다.내가 메인 설명을 업데이 트했습니다 : ( – PlexQ

6

통합 테스트에는 @TestFor을 사용하지 않아야합니다. 당신은 당신의 시험에서 컨트롤러의 인스턴스를 생성해야하고, 그에 PARAMS을 설정

class UserControllerTests extends GroovyTestCase { 
    void testLogin() { 
    def controller = new UserController() 
    controller.params.login = [email:'[email protected]', password:'123'] 
    controller.login() 
    assert "/user/main" == controller.response.redirectedUrl 
    } 
} 

세부 사항은 user guide에 있습니다.

+0

이것은 더 나은 일을 만들었지 만 여전히 작동하지 않습니다 .controller.redirectedUrl null입니다. 심지어 리디렉션 (작업 : "메인", 컨트롤러 : 사용자 "), 여전히 null입니다 .FWIW 사용자 가이드는 통합 테스트에 대해 혼란 스럽습니다. RTFM을 시도한 것은 분명합니다. 5 개의 단락을 묶어서 하나의 명확한 예가 될 수 있습니다. 지금 당장이 설명서에서 어떻게 외삽 법을 적용 할 수 있었는지 확인해보십시오. 그러나 처음 읽었을 때 명확하지 않습니다. – PlexQ

+0

비슷한 문제가 있었는데이를 수정했습니다. 'test-app'를 실행하면 모든 통합 테스트에 실패했습니다 'MissingMethodException'과 함께 특정 테스트를 실행하는 동안이 답변을 읽은 후 전체 상황을 유발 한'@ TestFor'를 사용한 통합 테스트 1 건을 발견했습니다! – Stephan

관련 문제