如何为返回值为nil或具体值的函数编写测试?我不关心实际值本身,我只关心值是否已经返回。
type CustomType struct{}
func TestSomeFunc(t *testing.T) {
case := map[string]struct {
Input string
Expected *CustomType // expected result
Error error // expected error value
} {
"test case 1":
"input",
&CustomType{}, // could be nil or a concrete value
nil,
"test case 2":
"input",
nil, // could be nil or a concrete value
ErrSomeError,
}
actual, err := SomeFunc(case.Input)
if (actual != case.Expected) {
t.Fatalf(...)
}
}
并且要测试的功能可能类似于:
func SomeFunc(input string) (*CustomType, error) {
foo, err := doSomething()
if err != nil {
return nil, err
}
return foo, nil
}
我想我想要的逻辑是:
if ((case.Expected != nil && actual == nil) ||
(case.Expected == nil && actual != nil)) {
t.Fatalf(...)
}
是否有更好的方法来断言存在而不是比较具体类型?
答案 0 :(得分:2)
它没有你所拥有的那么短,但我认为你想要的是测试只在(case.Expected == nil) == (actual == nil)
时通过,比较两个(true
或false
)的结果与nil
的比较。 Here's a short program demonstrating:
package main
import (
"fmt"
)
func main() {
isNil, isNotNil, otherNotNil := []byte(nil), []byte{0}, []byte{1}
fmt.Println("two different non-nil values\t", (otherNotNil == nil) == (isNotNil == nil))
fmt.Println("a nil and a non-nil value\t", (isNil == nil) == (isNotNil == nil))
fmt.Println("two nil values\t\t\t", (isNil == nil) == (isNil == nil))
}
正如用户icza指出的那样,当有==更改为!=
(类似(actual == nil) != (expected == nil)
),以获得true
>不匹配而不是匹配时。