go - 如何测试一个函数在 goroutine 中被调用?
问题描述
我想确保我们通过调用具有正确参数的函数来启动一个 goroutine。
例如:
func MyTest(t *testing.T) {
service.EXPECT().MyMockFunc(1)
service.MyFunc()
}
func MyFunc() {
go MyMockFunc(1)
}
当我运行这个测试时,它失败了,因为(我相信)MyMockFunc
只有在测试已经完成运行后才会被调用。
有没有办法通过调用具有正确参数的函数来测试我是否启动了 goroutine?
注意:理想情况下,我想保持传递给的参数不变MyMockFunc
(例如,不添加通道参数)。
解决方案
使用通道并假设您可以从测试中触发 goroutine:
package main
import (
"fmt"
"testing"
"time"
)
func MyMockFunc(n int) int {
fmt.Println("MyMockFunc is called")
time.Sleep(5 * time.Second)
return n + 1
}
func TestMyMockFunc(t *testing.T) {
result := make(chan int)
go func() {
result <- MyMockFunc(1)
}()
if <-result != 2 {
t.Fatalf("Expecting 2")
}
}
推荐阅读
- node.js - Typescript - 使用 Class-transformer 扁平化 JSON 模型
- python - 我的刮刀需要几个小时才能使用硒完成。我可以让它更快吗?
- java - 用于异步保存和更新操作的 ORM/库?
- ruby - Ruby:拦截popen系统调用并将stdout和stderr记录到同一个文件中
- python - 从反应中获取用户 ID
- javascript - 如何在背景图像 css 文件上正确编写 react 17.0.1?
- sum - 帕斯卡和计算器
- html - 每次单击时更改 Bootstrap 5 navbar-toggler 背景颜色
- javascript - 如何循环通过 puppeteer 选择器响应?
- r - 不是 R 中最简单的合并