首页 > 解决方案 > 如何测试一个函数在 goroutine 中被调用?

问题描述

我想确保我们通过调用具有正确参数的函数来启动一个 goroutine。

例如:

func MyTest(t *testing.T) {
    service.EXPECT().MyMockFunc(1)
    service.MyFunc()
}

func MyFunc() {
    go MyMockFunc(1)
}

当我运行这个测试时,它失败了,因为(我相信)MyMockFunc只有在测试已经完成运行后才会被调用。

有没有办法通过调用具有正确参数的函数来测试我是否启动了 goroutine?

注意:理想情况下,我想保持传递给的参数不变MyMockFunc(例如,不添加通道参数)。

标签: gogomock

解决方案


使用通道并假设您可以从测试中触发 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")
    }
}

推荐阅读