我正在使用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] 删除。
我来说两句