как интегрировать тестовое тело электронной почты в сервис Grails, который использует плагин Mail - PullRequest
2 голосов
/ 16 января 2012

Я пытаюсь написать интеграционные тесты для службы Grails, которая, помимо прочего, отправляет электронную почту через отличный Mail Plugin .Я могу отключить фактическую отправку электронной почты через конфигурацию, и это здорово, но я хотел бы убедиться, что параметры правильные, тело отображается правильно или, по крайней мере, метод был вызван, когда я ожидал.Согласно документации, должен быть указан полный путь к GSP для тела.

В рамках моего теста я хотел бы сделать что-то вроде этого - есть ли способ получить доступ к телу электронной почты и другим параметрам программнопосле отправки?

sendMail {
  to myemailparams.to
  subject myemailparams.subject
  body( view:"/emailviews/someemailview", 
      model:[contentparam: myemailparams.somecontentvalue)
}

//verify correct sending to and subject parameters, and that body contains correct contentvalue
//or at least that the method has been called (Mock it out?)

Примечание. Я понимаю, что могу инкапсулировать тестирование рендеринга тела письма в отдельный изолированный тест, не включающий почтовый плагин.Но цель этого интеграционного теста - убедиться, что многие вещи, в том числе отправка электронной почты, происходят правильно при вызове метода сервиса.Я даже был бы удовлетворен ответом, который описывает, как смоделировать службу, и проверка, которая проверяет «sendMail», была вызвана, когда ожидалось.

Ответы [ 2 ]

4 голосов
/ 16 января 2012

Вы можете переопределить метод sendMail, используя metaClass , а затем выполнить некоторую проверку, чтобы убедиться, что sendMail был вызван:

void testSendMail() {
    MyClass myClass = new MyClass()
    def sendMailCalled = false
    myClass.metaClass.sendMail = { Closure c->
       sendMailCalled = true
    }

    myClass.functionThatCallsSendMail()
    assert sendMailCalled
}
2 голосов
/ 15 июня 2015

Вот пример того, как я утверждаю вещи, которые были отправлены в MailService:

def setup(){
    mailParams = [:]
    mockMailService.ignore.sendMail{ callable ->
        messageBuilder = new MailMessageBuilder(null, new ConfigObject())
        messageBuilder.metaClass.body = { Map params ->
            mailParams.body = params
        }
        messageBuilder.metaClass.async = { Boolean param ->
            mailParams.async = param
        }
        messageBuilder.metaClass.to = { String param ->
            mailParams.to = param
        }
        messageBuilder.metaClass.subject = { String param ->
            mailParams.subject = param
        }
        callable.delegate = messageBuilder
        callable.resolveStrategy = Closure.DELEGATE_FIRST
        callable.call()
    }
    service.mailService = mockMailService.proxyInstance()
}

Затем, в моем тесте, после выполнения метода, который отправляет почту, я утверждаю таким образом (синтаксис Спока для утверждений):

    then:
        mailParams.to == 'test@test.com'
        mailParams.async == true
        mailParams.subject == 'fnuser.billingEmail.subject{}en'
        mailParams.body.view == '/mailtemplates/setBillingEmail'
        mailParams.body.model.destinationUrl == "myDestinationUrl"
        mailParams.body.model.logoUrl == 'myUrl/templatelogo.png'
        mailParams.body.model.locale == Locale.ENGLISH
...