Golang单元测试用户输入

时间:2015-12-18 00:00:15

标签: unit-testing testing go tdd

我正在努力学习TDD思维方式。我被困在测试中。

在下面的示例中,我提示用户输入,进行一些验证并打印结果。我为它编写了一个测试(正在通过)但是我觉得它没有达到验证部分,所以我做错了。任何建议将不胜感激。

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

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "regexp"
    "strings"
)

func main() {
    response := askQuestion("What is your name?")
    fmt.Printf("Hello %s\n",response)
}

func askQuestion(question string) string {
    reader := bufio.NewReader(os.Stdin)
    answer := ""

    for {
        fmt.Printf("%s\n", question)
        input, err := reader.ReadString('\n')
        if err != nil {
            if err != io.EOF {
                panic(err)
            }
            break
        }

        if regexp.MustCompile(`[A-Z]{5}`).MatchString(strings.TrimSpace(input)) == true {
            answer = strings.TrimSpace(input)
            fmt.Printf("You entered %s\n", answer)
            break
        } else {
            fmt.Printf("\033[31mYou must enter only 5 upper case letters.\n\033[0m")
            continue
        }
    }

    return answer
}

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

package main

import (
    "bytes"
    "fmt"
    "io"
    "io/ioutil"
    "os"
    "reflect"
    "strings"
    "testing"
)

func TestAskQuestion(t *testing.T) {
    expected := "foo"
    entered := "foo"

    askQuestion("What is your last name?")

    oldStdout := os.Stdout
    r, w, _ := os.Pipe()

    os.Stdout = w
    fmt.Println(entered)

    outC := make(chan string)
    go func() {
        var buf bytes.Buffer
        io.Copy(&buf, r)
        outC <- buf.String()

    }()

    w.Close()
    os.Stdout = oldStdout
    out := strings.TrimSpace(<-outC)

    b, _ := ioutil.ReadAll(os.Stdin)
    t.Log(string(b))

    if !reflect.DeepEqual(expected, out) {
        t.Fatalf("Test Status Failure Issue. Got: '%v' expected %s", out, expected)
    }
}

1 个答案:

答案 0 :(得分:2)

Go的测试需要存在于名为xyz_test.go的文件中,因此游乐场不适合熟悉单元测试功能。

如果您已在本地安装,请运行命令go help test,以获得非常简短的介绍。