grailsEメールプラグインを使用してEメールを送信しているGrailsコントローラーをテストしたいと思います。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'
}
}
このテストを実行すると、multipart
インタラクションの呼び出しが1ではなく0になります。given:
ブロックの2行目は疑わしいようですが、テストのClosure
代わりにモックを実行しようとするとorg.springframework.mail.MailMessage
クラッシュします。また、コントローラー自体が期待どおりに機能することにも言及する必要があります(最初に単体テストを理解するのが待ちきれませんでした)。
編集済み
ああ、数時間後に新鮮な心でコードを見ると、上記のコードが機能しない理由がわかります。キャッチmultipart
やその他のDSL呼び出しを行うには、sendMailメソッドではなく、クロージャー自体をモックする必要があります(クロージャーはコントローラー自体の内部で定義されているため、これはできません)。私がおそらくできることは、メソッドの引数をチェックして、sendMail
必要なものがすべて渡されたことを確認することです。