我是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
请任何人帮助我解决这个问题。
我猜你正在使用可搜索的插件。如果您想测试搜索功能,请编写一个IntegrationSpec。要在控制器中模拟Domainclass的搜索调用,最好将其包装在一个服务方法中,并模拟出服务。
我认为您不希望在这里测试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()命令的方法来创建Service,并在你的控制器搜索方法中使用这个服务方法。
像这样:
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])
}
我希望你明白我的意思。