【问题标题】:how to integration test email body in a Grails Service that uses the Mail plugin如何在使用 Mail 插件的 Grails 服务中集成测试电子邮件正文
【发布时间】:2012-02-11 15:22:36
【问题描述】:

我正在尝试为 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”的检查。

【问题讨论】:

    标签: grails mocking integration-testing


    【解决方案1】:

    您可以使用metaClass 覆盖 sendMail 方法,然后进行一些检查以确保调用了 sendMail:

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

    【讨论】:

    • 这非常方便 - 我没有想到闭包中的变量在我的测试中在闭包之外可见。效果很好。
    【解决方案2】:

    这是我如何断言发送到 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()
    }
    

    然后,在我的测试中,在执​​行发送邮件的方法后,我以这种方式断言(断言的Spock语法):

        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
    

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 2019-10-28
      • 2010-10-03
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      相关资源
      最近更新 更多