首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Grails 3.2中如何测试服务中事件的触发?

在Grails 3.2中如何测试服务中事件的触发?
EN

Stack Overflow用户
提问于 2017-02-14 07:35:56
回答 3查看 510关注 0票数 1

我在Grails 3.2.5上运行,并实现了一个简单的服务。该服务有一个私有方法和一个公共方法。私有方法触发事件的notify方法(由EventBus特征提供)。

代码语言:javascript
代码运行次数:0
运行
复制
@Transactional
class SyncService {
    def processQueue() {
        checkStatus(true)
    }

    private checkStatus(status) {
       if(status) {
           def model = [...]
           notify "status.completed", model
       }
    }
}

如何为该服务编写单元测试,以检查通知是否已被触发?以下实现不起作用:

代码语言:javascript
代码运行次数:0
运行
复制
@TestFor(SyncService)
class SyncServiceSpec extends Specification {

    void "test if notification is triggerd() {
        when:
            service.processQueue()

        then: "notification should be triggered"
            1 * service.notify(_)

    }
}

测试失败,输出如下:

代码语言:javascript
代码运行次数:0
运行
复制
Too few invocations for:

1 * service.notify(_)   (0 invocations)

谢谢你的帮忙!

EN

回答 3

Stack Overflow用户

发布于 2017-12-20 00:38:23

您可以模拟事件总线并在模拟上执行交互测试(在3.2.11中测试)

代码语言:javascript
代码运行次数:0
运行
复制
@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

  }
}
票数 2
EN

Stack Overflow用户

发布于 2017-02-14 16:01:04

下面的表达式:

代码语言:javascript
代码运行次数:0
运行
复制
1 * service.notify(_)

表示使用任何单个参数调用notify方法。

试试这个:

代码语言:javascript
代码运行次数:0
运行
复制
1 * service.notify(*_)

PS在“调用次数太少:”消息之后还有其他信息吗?有什么被调用的例子吗?

票数 1
EN

Stack Overflow用户

发布于 2017-02-16 05:35:51

为了测试事件,我发现了一种变通方法。我不是检查notify方法是否被触发,而是使用on方法测试事件是否被触发。因此,在我的测试类中,我有如下内容:

代码语言:javascript
代码运行次数:0
运行
复制
@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

    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42215436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档