how to test the result in goroutine without wait in test

Issue

When I do ut of golang, I sometimes need to test the result in goroutine, I was using time.Sleep to test, I am wondering is there any better way to test.

let’s say I have an example code like this

func Hello() {
    go func() {
        // do something and store the result for example in db
    }()
    // do something
}

Then when I test the func, I want to test both result in goroutine,
I am doing this:

 func TestHello(t *testing.T) {
        Hello()
        time.Sleep(time.Second) // sleep for a while so that goroutine can finish
        // test the result of goroutine
 }

is there any better way to test this?

Basically, in real logic, I don’t care the result in goroutine, I don’t need to wait for it finished. but in test, I want to check after it finished.

Solution

If you really want to check the result of a goroutine, you should use a channel like so:

package main

import (
    "fmt"
)

func main() {
    // in test
    c := Hello()
    if <-c != "done" {
        fmt.Println("assert error")
    }

    // not want to check result
    Hello()
}

func Hello() <-chan string {
    c := make(chan string)
    go func() {
        fmt.Println("do something")
        c <- "done"
    }()
    return c
}

https://play.golang.org/p/zUpNXg61Wn

Answered By – faisal burhanudin

Answer Checked By – Terry (GoLangFix Volunteer)

Leave a Reply

Your email address will not be published.