为了账号安全,请及时绑定邮箱和手机立即绑定

通过多次传递输入来测试函数

通过多次传递输入来测试函数

Go
HUH函数 2022-11-08 15:36:52
我正在通过测试学习围棋。从“Head First Go”的第 2 章末尾,我得到了以下程序。它让用户尝试从 1 到 10 猜测一个数字 3 次:guess.gopackage mainimport (    "fmt"    "math/rand"    "time"    "bufio"    "os"    "log"    "strconv"    "strings")func generateRandomNumber() int {    rand.Seed(time.Now().Unix())       // seed value based on time to generate non-deterministic random values    randomNum := rand.Intn(10) + 1     // range: [0, 10); produces the same value without Seed(), i.e., pseudo-random    return randomNum}func guess() int {    var success bool = false    target := generateRandomNumber()    fmt.Println("Guess a number between 1 and 10")    guess  := bufio.NewReader(os.Stdin)    for attempts := 0; attempts < 3; attempts++ {        fmt.Println("You have", 3-attempts, "guesses left")        userVal, err := guess.ReadString('\n')        if err != nil {            log.Fatal(err)        }            input := strings.TrimSpace(userVal)        answer, err := strconv.Atoi(input)        if err != nil {            log.Fatal(err)        }            if answer == target {            fmt.Println("Congratulations !!")            return answer        } else if answer > target {            fmt.Println("Your guess was HIGHER")        } else if answer < target {            fmt.Println("Your guess was LOWER")        }    }    if !success {        fmt.Printf("Sorry, you've run out of attempts... The correct value is %d\n", target)        return target       }    return 0}func main() {    guess()}guess_test.gopackage mainimport (    "testing")func TestRandomNumber(t *testing.T) {    want := generateRandomNumber()        if 7 != want {        t.Fail()        t.Logf("Incorrect guess; The random number was %d", want)    }}如何guess()通过传入三个不同的输入进行测试?我想通过比较 with 的返回值来进行guess()测试generateRandomNumber()。
查看完整描述

1 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

您可以更改guess函数以从输入中获取阅读器,这样我们就可以将它传递给我们想要的任何阅读器:在主要我们通过stdin阅读器,在测试中我们通过模拟阅读器:


guess.go


package main


import (

    "bufio"

    "fmt"

    "log"

    "math/rand"

    "os"

    "strconv"

    "strings"

    "time"

)


func generateRandomNumber() int {

    rand.Seed(time.Now().Unix())   // seed value based on time to generate non-deterministic random values

    randomNum := rand.Intn(10) + 1 // range: [0, 10); produces the same value without Seed(), i.e., pseudo-random

    return randomNum

}


func guess(reader *bufio.Reader) (int, error) {

    target := generateRandomNumber()


    fmt.Println("Guess a number between 1 and 10")


    for attempts := 0; attempts < 3; attempts++ {

        fmt.Println("You have", 3-attempts, "guesses left")

        userVal, err := reader.ReadString('\n')

        if err != nil {

            log.Fatal(err)

        }


        input := strings.TrimSpace(userVal)

        answer, err := strconv.Atoi(input)

        if err != nil {

            log.Fatal(err)

        }


        if answer == target {

            fmt.Println("Congratulations !!")

            return answer, nil

        } else if answer > target {

            fmt.Println("Your guess was HIGHER")

        } else if answer < target {

            fmt.Println("Your guess was LOWER")

        }

    }


    fmt.Printf("Sorry, you've run out of attempts... The correct value is %d\n", target)

    return target, fmt.Errorf("attempts is over")

}


func main() {

    reader := bufio.NewReader(os.Stdin)

    guess(reader)

}

用于检测:


guess_test.go


package main


import (

    "bufio"

    "fmt"

    "strings"

    "testing"

)


func TestRandomNumberOk(t *testing.T) {

    want := generateRandomNumber()

    msg := fmt.Sprintf("3\n4\n%d\n", want)

    reader := strings.NewReader(msg)

    r := bufio.NewReader(reader)

    _, err := guess(r)

    if err != nil {

        t.Errorf("guess must successfull")

    }

}


func TestRandomNumberFail(t *testing.T) {

    want := generateRandomNumber()

    msg := fmt.Sprintf("3\n4\n%d\n", want+1)

    reader := strings.NewReader(msg)

    r := bufio.NewReader(reader)

    _, err := guess(r)

    if err == nil {

        t.Errorf("guess must unsuccessfull")

    }

}

我不得不更改您的猜测返回值,因为它何时成功与否未知


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信