gpt4 book ai didi

email - 如何在 Spock 中模拟特定于域的闭包

转载 作者:行者123 更新时间:2023-12-04 17:38:24 25 4
gpt4 key购买 nike

我想测试一个使用 grails 电子邮件插件发送电子邮件的 Grails Controller 。我不知道如何模拟 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)
}

Controller 代码看起来像您期望的那样,例如:
def mailService
def sendNow() {
mailService.sendMail {
multipart true
to 'example@example.org'
from 'me@here.com'
subject 'a subject'
body 'a body'
}
}

如果我运行这个测试,我会得到 0 次 multipart 的调用。交互而不是1。 given:的第二行block 对我来说似乎很可疑,但是如果我试图模拟一个 Closure而不是 org.springframework.mail.MailMessage我的测试崩溃了。我还应该提到 Controller 本身按预期工作(它等不及我先弄清楚单元测试)。

已编辑

啊哈,几个小时后以全新的心态看代码,我明白为什么上面的代码不起作用了;为了让我 catch multipart和其他 DSL 调用,我必须模拟闭包本身,而不是 sendMail 方法(我不能这样做,因为闭包是在 Controller 本身内部定义的)。我可能能做的是检查 sendMail 的参数。方法来查看所有必要的东西被传递给它。

最佳答案

我能够通过以下方式在 Spock 中实现这一点:

def messageBuilder
def bodyParams
def setup(){
def mockMailService = new MockFor(MailService)
mockMailService.ignore.sendMail{ callable ->
messageBuilder = new MailMessageBuilder(null, new ConfigObject())
messageBuilder.metaClass.body = { Map params ->
bodyParams = params
}
callable.delegate = messageBuilder
callable.resolveStrategy = Closure.DELEGATE_FIRST
callable.call()
}
service.mailService = mockMailService.proxyInstance()
}

和一个示例测试:
def "sendEmailReceipt_passesCorrectParams"(){
when:
def receiptItems = [] << [item: "item1", price: 100]
service.sendEmailReceipt(receiptItems, "some@email.com")

then:
messageBuilder.message.to[0] == "some@email.com"
messageBuilder.message.subject == "My subject"
bodyParams.view == "/mailtemplates/emailReceipt"
bodyParams.model.receiptItems == data
}

关于email - 如何在 Spock 中模拟特定于域的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10715919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com