我想测试一个使用 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'
}
}
如果我运行这个测试,我会得到 0multipart
次交互调用而不是 1 次。该given:
块的第二行对我来说似乎很可疑,但如果我尝试模拟 aClosure
而不是org.springframework.mail.MailMessage
我的测试崩溃。我还应该提到控制器本身按预期工作(它等不及我先弄清楚单元测试)。
已编辑
啊哈,几个小时后重新看代码,我明白为什么上面的代码不起作用了;为了让我捕捉multipart
和其他 DSL 调用,我必须模拟闭包本身,而不是 sendMail 方法(我不能这样做,因为闭包是在控制器本身内部定义的)。我可能能做的是检查方法的参数,sendMail
看看所有必要的东西都传递给它。