2012-01-16 8 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

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 

はその後、私のテストでは、メールを送信する方法を実行した後、私は(アサーションのためのスポック構文)この方法を主張します

関連する問題