我在使用Gock进行测试期间模拟了HTTP调用,除非我从单独的goroutine中运行HTTP调用(请考虑go Post("https://myapi.com", "this body"),否则它运行良好。在这种情况下,我实际上并不关心HTTP响应,只是想触发请求。

这导致http.Client.send()gock.New()之间的竞争状态。有没有解决的方法,或者在这种情况下建议的模拟API调用的方法是什么?

谢谢!

最佳答案

您可以将 TestMain 用于以下结构:

func setup() {
    //Mock microservice
    gock.New("...")

    // JOB finished URI
    // Mock: go Post("https://myapi.com", "this body")
    gock.New("...")
    // other setup
}

func cleanup() {
    //Wait until all mock done/timeout
    //Adjust as needed
    timeoutSec := 10
    for timeoutSec > 0 && gock.IsPending() {
        time.Sleep(1 * time.Second)
        timeoutSec--
    }
}

func TestMain(m *testing.M) {
    defer gock.Off()

    setup()
    ret := m.Run()
    if ret == 0 {
        cleanup()
    }

    os.Exit(ret)
}

func TestYourService(t *testing.T) {
    //Perform testing:
    //  access microservice + job in separate goroutine
}

09-04 04:48