【问题标题】:Grails unit test mocking domain class within its controllerGrails 单元测试在其控制器中模拟域类
【发布时间】:2014-06-29 08:23:47
【问题描述】:

我是 grails 新手。在我的 Web 应用程序中,我使用 spock 进行单元测试。

我使用可搜索插件来实现搜索功能。

在我的控制器中搜索方法定义为:

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])
}

在测试时我已经定义了

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'

    }

但我不能模拟 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

请任何人帮助我解决此问题。

提前致谢。

【问题讨论】:

  • 请任何人知道如何在测试用例中动态添加方法,请让我找到解决方案。

标签: unit-testing grails mocking


【解决方案1】:

我猜你正在使用可搜索插件。 如果您想测试搜索功能,请编写一个 IntegrationSpec。 要在控制器中模拟对域类的搜索调用,最好将其包装在服务方法中并模拟服务。

我认为您不想在这里测试 Question 域的约束。

试试这样的:

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])
}

希望你明白我的意思。

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多