unit-testing - 在 Go 中测试不带 sleep 的异步结果

标签 unit-testing testing go

我的代码中有相当多的组件具有持久的 go-routines,它们监听事件以触发操作。大多数情况下,他们没有理由(在测试之外)在完成该操作后发回通知。

但是,我的单元测试使用 sleep 来等待这些异步任务完成:

// Send notification event.
mock.devices <- []sparkapi.Device{deviceA, deviceFuncs, deviceRefresh}

// Wait for go-routine to process event.
time.Sleep(time.Microsecond)

// Check that no refresh method was called.
c.Check(mock.actionArgs, check.DeepEquals, mockFunctionCall{})

这似乎很糟糕,但我还没有想出一个更好的解决方案,它不会给非测试使用增加不合理的开销。有没有我错过的合理解决方案?

最佳答案

惯用的方法是将 done channel 与您的数据一起传递给工作程序 go-routine。 go-routine 应该 close done channel 并且您的代码应该等到 channel 关闭:

done := make(chan bool)

// Send notification event.
mock.devices <- Job {
    Data: []sparkapi.Device{deviceA, deviceFuncs, deviceRefresh},
    Done: done,
}

// Wait until `done` is closed.
<-done

// Check that no refresh method was called.
c.Check(mock.actionArgs, check.DeepEquals, mockFunctionCall{})

使用此模式,您还可以为您的测试实现超时:

// Wait until `done` is closed.
select {
case <-done:
case <-time.After(10 * time.Second):
    panic("timeout")
}

关于unit-testing - 在 Go 中测试不带 sleep 的异步结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30427013/

相关文章:

python - 模拟函数以引发异常以测试 except block

Swift Switch Default case 永远不会被执行

javascript - 基于浏览器的测试工具哪个不坏?

windows - 如何在Windows上执行GoApp Binary-特别是oauth2l

java - 如何使用 "Spring Data JPA"规范进行单元测试方法

javascript - 在函数内对 NodeJS Promise 进行单元测试

c++ - 如何测试对私有(private)函数的访问?

testing - 什么是最适合 MS Dynamics CRM 混合应用程序的 GUI 测试工具?

go - 创建扩展类型数组

go - 接口(interface)命名约定 Golang