亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用錯誤對象正確測試?

如何使用錯誤對象正確測試?

Go
回首憶惘然 2022-08-01 10:52:21
因此,讓我們假設我有一個要測試的函數。此函數將如下所示:func coolFunction(input int) (error, int) {  if input == 1 {    err := error.New("This is an error")    number := 400  } else {    err := nil    number := 200  }  return err, number}如果我想測試這個函數,有正數和負數,我必須寫一個這樣的測試函數:func TestCoolFunction(t *testing.T) {    type args struct {        input int    }    tests := []struct {        name         string        args         args        wantError    error        wantInt      int    }{        {"No error",             args{                0,            },             nil,            200,             },    }}所以這很好用。但是,如果錯誤對象不是,我該如何測試否定情況?nil我的目標是知道是否,因此測試在使用上述結構時將PASS顯示為結果。有什么想法嗎?error != nil
查看完整描述

1 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

如果我理解正確,您希望在某些條件下檢查正確的錯誤返回。


這是:


func coolFunction(input int) (int, error) {

    var err error

    var number int

    if input == 1 {

        err = errors.New("This is an error")

        number = 400

    } else {

        err = nil

        number = 200

    }


    return number, err

}

然后在測試文件中,您需要對預期錯誤的事實(理所當然)有一個理解或協議。就像下面的標志一樣,這對于您的情況來說是正確的。expectError bool


您還可以為特定錯誤類型設置字段,并檢查返回的類型是否正是該字段。


func TestCoolFunction(t *testing.T) {


    var testTable = []struct {

        desc        string

        in          int

        expectError bool

        out         int

    }{

        {"Should_fail", 1, true, 0},

        {"Should_pass", 100, false, 200},

    }


    for _, tt := range testTable {


        t.Run(tt.desc, func(t *testing.T) {

            out, err := coolFunction(tt.in)

            if tt.expectError {

                if err == nil {

                    t.Error("Failed")

                }

            } else {

                if out != tt.out {

                    t.Errorf("got %d, want %d", out, tt.out)

                }

            }

        })


    }

}

使用@mkopriva建議添加特定的錯誤檢查DeepEqual


func TestCoolFunction(t *testing.T) {


    var testTable = []struct {

        desc        string

        in          int

        expectError error

        out         int

    }{

        {"Should_fail", 1, errors.New("This is an error"), 0},

        {"Should_pass", 100, nil, 200},

    }


    for _, tt := range testTable {


        t.Run(tt.desc, func(t *testing.T) {

            out, err := coolFunction(tt.in)

            if tt.expectError != nil {

                if !reflect.DeepEqual(err, tt.expectError) {

                    t.Error("Failed")

                }

            } else {

                if out != tt.out {

                    t.Errorf("got %d, want %d", out, tt.out)

                }

            }

        })


    }

}

另外,為了演示,您應該使用一些不同的方法來檢查更快的錯誤。這取決于應用程序中錯誤的設計方式。您可以使用哨兵錯誤或類型/接口檢查。或者自定義錯誤類型中基于 const 的枚舉字段。DeepEqual


查看完整回答
反對 回復 2022-08-01
  • 1 回答
  • 0 關注
  • 99 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號