2014-05-12 6 views
4

Grails를 처음 사용했습니다. 내 웹 응용 프로그램에서 단위 테스트 spock을 사용하고 있습니다.컨트롤러 내의 Grails 유닛 테스트 조롱 도메인 클래스

검색 기능을 위해 검색 가능한 플러그인을 사용했습니다. 테스트 나는

void "action search questions : search with blank search query"() { 

     setup: 
     controller.params.q="" 
     mockForConstraintsTests(Question) 
     mockDomain(User) 
     def question1 =new Question(title:'demo1', owner:new User(username:"Jini").save()) 
     def question2 =new Question(title:'demo2', owner:new User(username:"Jini").save()) 

     Question.search() >> [question1,question2] 
     when: 
     controller.search() 

     then: 
     view == '/question/include_questionlist' 

    } 

을 정의하면서

def search(SearchQueryCommand searchQueryCommand) { 
     def question 
     if (!searchQueryCommand.q?.trim() && !searchQueryCommand.tag?.trim() && !searchQueryCommand.name?.trim()) { 
      params.sort='sortableTitle' 
      params.order='desc' 
      question = Question.search(MessageStatusEnum.ACTIVE.getType().toString(), params) 
     } 
    render(view: "include_questionlist", model: [questionList: question.results, totalSize:question.total , max:params.max?:'Constants.PAGINATION_DEFAULT_MAX', pagination:true ,questionDescription:true]) 
} 

하지만 Question.search() 메소드를 조롱 할 수 없습니다 내 컨트롤러 검색 방법에

는 다음과 같이 정의된다.

Failure: action search questions : search with blank search query(com.orb.question.QuestionControllerSpec) 
| groovy.lang.MissingMethodException: No signature of method: com.orb.question.Question.search() is applicable for argument types: (java.lang.String, org.codehaus.groovy.grails.web.servlet.mvc.GrailsParameterMap) values: [1992, [q:, sort:sortableTitle, order:desc]] 
Possible solutions: each(groovy.lang.Closure), attach(), merge(), refresh(), save(), attach() 
    at org.grails.datastore.gorm.GormStaticApi.methodMissing(GormStaticApi.groovy:97) 
    at com.orb.question.QuestionController.search(QuestionController.groovy:115) 
    at com.orb.question.QuestionControllerSpec.action search questions : search with blank search query(QuestionControllerSpec.groovy:200) 
| Completed 22 spock tests, 1 failed in 7480ms 

로 수신

오류 메시지 누구도 날이 문제를 해결하는 데 도움이 바랍니다.

미리 감사드립니다.

+0

테스트 케이스에서 메소드를 동적으로 추가하는 방법을 알고 계시다면 해결책을 찾도록하십시오. – JayKay

답변

4

검색 가능한 플러그인을 사용하고있는 것 같습니다. 검색 기능을 테스트하려면 IntegrationSpec을 작성하십시오. 컨트롤러 내의 Domainclass에 대한 검색 호출을 모의하려면 서비스 메소드에서 랩핑하고 서비스 모의하는 것이 가장 좋습니다.

그리고 여기서 질문 도메인에 대한 제약 조건을 테스트하고 싶지는 않다고 생각합니다. 그런

시도 뭔가 :

void "action search questions : search with blank search query"() { 

    setup: 
    params.q="" 
    mockDomain(Question) 
    mockDomain(User) 
    def question1 =new Question(title:'demo1', owner:new User(username:"Jini").save()) 
    def question2 =new Question(title:'demo2', owner:new User(username:"Jini").save()) 

    QuestionService fakeQuestionService = Mock() 
    fakeQuestionService.search(_,_) >> [question1,question2] 
    controller.questionService = fakeQuestionService 

    when: 
    controller.search() 

    then: 
    view == '/question/include_questionlist' 

} 

당신은 Question.search() 명령을 래핑하는 방법으로 서비스를 만들고 컨트롤러 검색 방법이 서비스 방법을 사용해야합니다. 그런

뭔가 :

class QuestionService { 

    def search(String query, def params) { 

     Question.search(query, params) 
    } 

} 

귀하의 컨트롤러 검색 방법 :

def search(SearchQueryCommand searchQueryCommand) { 
    def question 

    if (!searchQueryCommand.q?.trim() && !searchQueryCommand.tag?.trim() && !searchQueryCommand.name?.trim()) { 
     params.sort='sortableTitle' 
     params.order='desc' 
     question = questionService.search(MessageStatusEnum.ACTIVE.getType().toString(), params) 
    } 
    render(view: "include_questionlist", model: [questionList: question.results, totalSize:question.total , max:params.max?:'Constants.PAGINATION_DEFAULT_MAX', pagination:true ,questionDescription:true]) 
} 

난 당신이 무슨 뜻인지 이해 바랍니다.

+0

나는 그것을 얻었다. ... 그리고 그것을 시험해 볼 예정이다. – JayKay

+0

아주 좋은 해결책 – JayKay

+0

감사합니다. 나는 기쁘다. – knarfancho

관련 문제