如何在Grails 3.2中测试服务中事件的触发?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Grails 3.2中测试服务中事件的触发?相关的知识,希望对你有一定的参考价值。
我在Grails 3.2.5上运行并实现了一个简单的服务。该服务有私人和公共方法。 private方法触发EventBus的notify方法(由Events trait提供)。
@Transactional
class SyncService {
def processQueue() {
checkStatus(true)
}
private checkStatus(status) {
if(status) {
def model = [...]
notify "status.completed", model
}
}
}
如何为此服务编写单元测试,以检查通知是否已被触发?以下实现不起作用:
@TestFor(SyncService)
class SyncServiceSpec extends Specification {
void "test if notification is triggerd() {
when:
service.processQueue()
then: "notification should be triggered"
1 * service.notify(_)
}
}
测试失败,输出如下:
Too few invocations for:
1 * service.notify(_) (0 invocations)
谢谢你的帮助!
答案
您可以模拟事件总线并在模拟上执行交互测试(在3.2.11中测试)
@TestFor(SyncService)
class SyncServiceSpec extends Specification {
void 'test if notification is triggered'() {
given: 'a mocked event bus'
EventBus eventBusMock = Mock(EventBus)
service.eventBus = eventBusMock
when:
service.processQueue()
then: 'event bus is notified once'
1 * eventBusMock.notify(*_) //<--- you could get more specific with your arguments if you want
}
}
另一答案
以下表达式:
1 * service.notify(_)
表示使用任何单个参数单次调用notify方法。
试试这个:
1 * service.notify(*_)
PS在“Too few invocations for:”消息之后是否有任何其他信息?是什么被调用的例子?
另一答案
我发现了一种解决方法来测试该事件。我没有检查是否触发了notify方法,而是测试是否使用on方法触发了事件。因此,在我的测试课中我有类似的东西:
@TestFor(SyncService)
class SyncServiceSpec extends Specification {
void "test if notification is triggerd() {
when:
def eventResponse = null
service.processQueue()
service.on('status.completed') { data ->
eventResponse = data
}
then: "notification should be triggered"
eventResponse != null
}
}
以上是关于如何在Grails 3.2中测试服务中事件的触发?的主要内容,如果未能解决你的问题,请参考以下文章