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

你将如何为一个返回值可能是 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(...)

}

有没有更好的方法来断言存在而不是比较具体类型?


波斯汪
浏览 158回答 1
1回答

斯蒂芬大帝

它并不比你所拥有的要短很多,但我认为你想要的是只有当比较两个比较(case.Expected == nil) == (actual == nil)的(true或false)结果时才能通过测试nil。这是一个简短的程序演示:package mainimport (    "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不匹配的时间而不是匹配的时间。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go