【发布时间】:2015-08-03 14:31:07
【问题描述】:
我正在使用 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
}
当然,由于 goroutine 的原因,除非我输入 time.Sleep(),否则它不起作用。
我如何告诉我的测试,“在运行测试之前等待另一个例程完成它的工作”,而不是进入一些任意的睡眠?我正在测试我的处理程序是否正确处理了该事件。
备用接口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")
}()
}
【问题讨论】:
-
什么是
createAndMonitorEvents? -
只是我的
main()调用的一个例程,用于创建 dockerclient 并监控事件。我会更新q。 -
所以它只是调用处理程序的事件的侦听器。没什么大不了。我的问题是如何让测试等待以确保事件得到正确处理。
-
大大改变了我的答案——我认为你可以使用
MonitorEvents,而你看到的nils 只是频道关闭的症状(你可以通过几种方式处理) .