给出像这样的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)
}
}
}
答案 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)
}