测试返回值的存在可能是具体的还是无的

时间:2016-06-02 19:12:58

标签: go

如何为返回值为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 个答案:

答案 0 :(得分:2)

它没有你所拥有的那么短,但我认为你想要的是测试只在(case.Expected == nil) == (actual == nil)时通过,比较两个(truefalse)的结果与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 >不匹配而不是匹配时。