表测试有错误

时间:2017-07-29 00:02:42

标签: go

给出像这样的Golang函数:

func GetKey(key string, data map[string]string) (string, error) {
    value, present := data[key]

    if !present {
        return "", errors.New(fmt.Sprintf("requested key does not exist: %s", key))
    }

    return value, nil
}

我将如何使用测试表来测试我返回的错误的存在?例如:

func TestGetKey(t *testing.T) {

    cases := []struct {
        Input  map[string]string
        Key    string
        Result string
        Err    error
    }{
        {
            map[string]string{
                "foo": "bar",
                "baz": "bah",
            },
            "foo",
            "bar",
            nil,
        },

        {
            map[string]string{
                "foo": "bar",
                "baz": "bah",
            },
            "nope",
            "",
            ????,
        },
    }

    // and something like
    for _, v := range cases {
        actual, err := GetKey(v.Key, v.Input)
        if actual != v.Result {
            t.Fatalf("Expected %s. Got %s", v.Result, actual)
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以存储您希望获得的相同错误,然后断言两者都返回相同的Error()

所以在地图中,对于错误情况:

{
   map[string]string{
       "foo": "bar",
       "baz": "bah",
   },
   "nope",
   "",
   errors.New("requested key does not exist: nope"),
}

在您的测试代码中:

for _, v := range cases {
    actual, err := GetKey(v.Key, v.Input)
    if actual != v.Result {
        t.Fatalf("Expected %s. Got %s", v.Result, actual)
    }
    if (v.Err != nil) && (err == nil) {
        t.Fatalf("Expecting error (%s), did not get it", v.Err.Error())
    } else if (v.Err == nil) && (err != nil) {
        t.Fatalf("Got unexpected error: (%s)", err.Error())
    } else if (v.Err != nil) && (err != nil) && (v.Err.Error() != err.Error()) {
        t.Fatalf("Expecting error (%s). Got (%s)", v.Err.Error(), err.Error())
    }
}

请注意,有几种情况可以表示您没有预料到错误,但实际上有一个错误,预期一个错误并且没有得到错误,并且预期一个并且得到一个错误。

答案 1 :(得分:0)

也许我没有看到什么,但这通常是我这样做的方式:

actual, err := GetKey(v.Key)
if err != v.Err {
    t.Errorf("Unexpected error: %s", err)
}

或者,如果返回的错误可能不是特定的已知错误值,我可能会变平为一个字符串:

actual, err := GetKey(v.Key)
var errMsg string
if err != nil {
    errMsg = err.Error()
}
if errMsg != v.errMsg {
    t.Errorf("Unexpected error: %s", errMsg)
}