为了账号安全,请及时绑定邮箱和手机立即绑定

测试返回值是否存在,可能是具体的或零

测试返回值是否存在,可能是具体的或零

Go
波斯汪 2022-01-17 10:35:48
你将如何为一个返回值可能是 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不匹配的时间而不是匹配的时间。


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信