2012-01-16 29 views
2

我正在嘗試爲Grails服務編寫集成測試,其中包括通過優秀的Mail Plugin發送電子郵件。我可以通過配置禁用實際的電子郵件發送,這很好,但我想驗證參數是否正確正確呈現,或者至少在我期望的時候調用該方法。根據文件,必須提供給身體的GSP的完整路徑。如何在使用郵件插件的Grails服務中集成測試電子郵件正文

作爲我的測試的一部分,我想做這樣的事情 - 有沒有辦法在發送後以編程方式訪問電子郵件正文和其他參數?

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'的檢查。

回答

3

可以使用metaClass覆蓋sendmail的方法,然後做一些檢查,以確保Sendmail的被稱爲:

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

    myClass.functionThatCallsSendMail() 
    assert sendMailCalled 
} 
+0

這非常方便 - 我沒有想到封閉體中的變量,就像封閉體外可見的變量一樣。很棒。 – Peter 2012-03-14 22:45:19

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() 
} 

然後,在我的測試,執行發送郵件的方法之後,我斷言這種方式(斯波克語法斷言):

then: 
     mailParams.to == '[email protected]' 
     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 
相關問題