【发布时间】:2012-05-23 08:10:08
【问题描述】:
我想测试一个使用 grails 电子邮件插件发送电子邮件的 Grails 控制器。我不知道如何模拟 sendMail 闭包以使交互正常工作。这是我最新版本的测试代码:
def 'controller should send a multipart email'() {
given: 'a mocked mailService'
controller.mailService = Mock(grails.plugin.mail.MailService)
controller.mailService.sendMail(*_) >> Mock(org.springframework.mail.MailMessage)
when:
controller.sendNow()
then:
1* _.multipart(true)
}
控制器代码看起来像您所期望的那样,例如:
def mailService
def sendNow() {
mailService.sendMail {
multipart true
to 'example@example.org'
from 'me@here.com'
subject 'a subject'
body 'a body'
}
}
如果我运行这个测试,我会得到 0 次调用我的 multipart 交互而不是 1。given: 块的第二行对我来说似乎很可疑,但如果我尝试模拟 Closure 而不是 @ 987654327@ 我的测试崩溃了。我还应该提到控制器本身按预期工作(它等不及我先弄清楚单元测试)。
已编辑
啊哈,几个小时后重新看代码,我明白为什么上面的代码不起作用了;为了让我捕捉multipart 和其他DSL 调用,我必须模拟闭包本身,而不是sendMail 方法(我不能这样做,因为闭包是在控制器本身内部定义的)。我可能可以做的是检查 arguments 到 sendMail 方法,看看所有必要的东西都传递给它。
【问题讨论】:
-
..似乎我无法按我的意愿检查参数,至少在关闭的情况下:(
-
在我看来,您必须模拟 sendMail 方法,并且在该方法内部有一个存根,它实现了闭包中使用的不同属性和方法。让我们称之为评估者。您将初始化闭包的委托给 evaluatro,并执行闭包。评估者应该有断言。你看我在这里使用了更多的junit概念。我不知道你能多么容易地将它转化为 spock 概念。我将更新我的答案以放置一个小代码 sn-p 来说明这一点
-
@GregorPetrin 我已经编辑了我的答案,请检查它是否是一个好的解决方案。
标签: email grails multipart spock