Я хочу протестировать контроллер Grails, который отправляет электронные письма с помощью подключаемого модуля grails Email. Я в недоумении, как именно имитировать закрытие 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. Вторая строка блока задано:
кажется мне подозрительной, но если я попытаюсь имитировать Closure
вместо org.springframework.mail.MailMessage
мой тест падает. Я также должен упомянуть, что сам контроллер работает так, как ожидалось (он не мог дождаться, пока я сначала разберусь с модульными тестами).
Ага, взглянув на код на свежую голову несколько часов спустя, я понимаю, почему приведенный выше код не работает; чтобы я мог поймать multipart
и другие вызовы DSL, мне пришлось бы имитировать само закрытие, а не метод sendMail (и я не могу этого сделать, поскольку закрытие определено внутри самого контроллера). Что я, вероятно, могу сделать, так это проверить argumentsметода sendMail
, чтобы увидеть, что все необходимое было передано в него.