Тест Голанга на рутину с каналом - PullRequest
0 голосов
/ 02 октября 2018

У меня есть следующая функция, которая печатает точки на терминале при выполнении некоторого процесса, код работает как положено , но теперь я хочу проверить это.Как мне это сделать

func printdot(finish <-chan struct{}) {
    t := time.NewTicker(time.Second)
    defer t.Stop()
    for {
        select {
        case <-t.C:
            fmt.Print(".")
        case <-finish:
            return
        }
    }
}

Это тест

func Test_printdot(t *testing.T) {

    finish := make(chan struct{})
    start := time.Now()
    go printdot(finish)
    time.Sleep(1 * time.Second)

    sec := time.Since(start).Seconds()
    switch int(sec) {
    case 0:
        // Output:
    case 1:
        // Output: .
    case 2:
        // Output: ..
    case 3:
        // Output: ...
    default:
        t.Error(“Too much time…”)
    }

     close(finish)
}

Теперь тест продолжается без остановки, даже если я использую готовый код, есть идеи, как его улучшить?

1 Ответ

0 голосов
/ 02 октября 2018

Закрытие канала не отправляет данные, поэтому код никогда не достигнет значения return в программе.Этот трюк работает с оператором диапазона.Вы можете сделать что-то подобное

...