如何告诉我的测试等待goroutine中的回调?

迪奇:

我正在使用dockerclient https://github.com/samalba/dockerclient,它具有基于通道的API来侦听事件client.MonitorEvents()和方便的回调方法client.StartMonitorEvents(callbackHandler)

我想测试处理程序是否被调用。当然,dockerclient在goroutine中处理事件。

现在,我的处理程序只是吐出一条日志。如果我在测试中等待,一切都会处理。如果我不这样做,它将在处理任何内容之前退出:

func eventCallback(event *dockerclient.Event, ec chan error, args ...interface{}) {
  log.Printf("Received event: %#v\n", *event)
}

我的测试似乎很简单:

func TestReceiveEvent(t *testing.T) {
   createAndMonitorEvents(server.URL)
   <- eventReady
   eventWriter.Write([]byte(someEvent))
   // test for something here
}

当然,除非time.Sleep()由于goroutine而输入了a 否则它不起作用

我如何告诉我的测试,“除了等待一些睡眠之外,”在运行测试之前先等待另一个例程完成工作?我正在测试我的处理程序是否正确处理了该事件。

备用接口client.MonitorEvents()返回一个通道,该通道可以给我更大的控制权,但是从该通道接收信号会发出无限nil事件。

更新:

根据要求,createAndMonitorEvents为:

func createAndMonitorEvents(url string) {
  // Init the client
  docker, _ := dockerclient.NewDockerClient(url, nil)

  // Listen to events
  stopchan := make(chan struct{})

  go func() {
    eventErrChan, err := docker.MonitorEvents(nil, stopchan)
    if err != nil {
        return
    }

    for e := range eventErrChan {
        if e.Error != nil {
            return
        }
        eventCallback(&e.Event, nil)
    }
    fmt.Println("monitor in place")
  }()
}
性质:

我想当您nil使用时MonitorEvents,您只是看到事件通道已关闭(的来源MonitorEvents包括close(eventOrErrorChan)支持此功能的)。evt, ok := <-c可让您直接检查是否(ok关闭时为false),并for evt := range c在关闭后停止。通常,将从封闭通道接收的数据指定为“ [ 接收]先前已发送的任何值后元素类型的零值”

关于等待回调的问题:回调可以关闭通道。(或发送给它。)然后,您的测试可以使用以下命令等待指定的时间长度select

select {
case <-c:
        /* ...success... */
case <-time.After(5 * time.Second):
        /* timed out */
}

如果您知道某些错误情况导致处理程序无法完成或无法运行,则可能会在其他通道上发出这些情况或通过向发送一个不同的值来发出信号c

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

谁能告诉我如何一次在Java中删除两个元素?

谁能告诉我如何在Java中同时删除两个元素?

如何“等待”回调返回?

我如何等待异步回调函数集?

如何在goroutine中测试结果而无需等待测试

测试我的代码不等待的Goroutine

在Flutter中完成“ build”功能时,有没有回调告诉我?

在单元测试之前,如何等待异步调用在组件的安装回调中完成?

我可以在回调中动态创建测试规范吗?

MySQL EXPLAIN中的“已过滤”列告诉我什么,如何使用它?

谁能告诉我如何防止在Django模型中存储多个输入的空白输入字段

谁能告诉我如何在Python上提取并显示图像中的文本

我如何等待API回调完全呈现组件?

Android测试用例等待回调

谁能告诉我如何在Jtextfield中获取系统日期?

谁能告诉我如何使用Selenium Webdiver在Facebook中打印所有朋友列表?

谁能告诉我如何实现?

WordPress如何告诉我的CSS版本

谁能告诉我如何通过Android应用中的消息发送经度和纬度坐标?

如何告诉我的AWS Ubuntu实例从代码提交中拉出?

谁能告诉我如何在Rails中执行此n个case / switch语句

我如何获得此代码来告诉我单词在句子中的位置

我如何告诉我的UIView UIViewController中的按钮已被按下?(迅速)

Java如何告诉我已经访问过数组中的所有数字

谁能告诉我如何在 CarbonKit 中删除深灰色底部边框

我如何实现回调/等待我的代码?

我如何等待 beego 中的 goroutine 终止

在 tkinter 中,python 告诉我没有称为粘性的选项。如何解决?

告诉我如何使用此代码在输入中而不是在跨度中显示变量