如何在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中测试服务中事件的触发?的主要内容,如果未能解决你的问题,请参考以下文章

您如何在 grails 2.3 中测试服务或控制器方法

grails Grails 单元测试中的应用程序访问

如何在 Grails 2.0 服务中对 i18n 注入 messageSource 的使用进行单元或集成测试

如何对 Grails 应用程序进行并发修改测试

Grails 2.3 迁移脚本不会在集成测试期间运行

如何在此 Jest 测试中触发窗口加载事件?