jeudi 17 décembre 2015

Golang unit testing user input

I am trying to learn go with a TDD mindset. I am stuck getting my head wrapped around testing.

In the example below, I am prompting a user for input, doing a little validation and printing the results. I wrote a test for it (which is passing) however I don't feel like it is hitting the validation portion, so I am doing something wrong. Any advice would be appreciated.

http://ift.tt/1Icc6zE

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
}

http://ift.tt/1OzHbK3

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)
    }
}

Aucun commentaire:

Enregistrer un commentaire