Как имитировать замыкания, специфичные для домена, в Spock

Я хочу протестировать контроллер 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, чтобы увидеть, что все необходимое было передано в него.

5
задан lucke84 25 March 2013 в 12:54
поделиться