你将如何为一个返回值可能是 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(...)}有没有更好的方法来断言存在而不是比较具体类型?
1 回答
斯蒂芬大帝
TA贡献1827条经验 获得超8个赞
它并不比你所拥有的要短很多,但我认为你想要的是只有当比较两个比较(case.Expected == nil) == (actual == nil)的(true或false)结果时才能通过测试nil。这是一个简短的程序演示:
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 指出的那样,您可以将外部更改==为 a !=(给您类似的东西(actual == nil) != (expected == nil))以获取true不匹配的时间而不是匹配的时间。
- 1 回答
- 0 关注
- 157 浏览
添加回答
举报
0/150
提交
取消