1

下面是一个示例代码,它返回多个值。

func (c Calc) CreateTenantHandler(item *models.TenantInput) (*models.Response, *models.ErrorDetails) {

        ...
        ...
        ...

        return &models.Response{ResponseStatus: 201, TenantOutput: tenantoutput,}, nil

    }

在测试文件中,我尝试过做以下事情。

assert.Equal(t,[nil,nil],testObject.CreateTenantHandler(nil) );

我还检查了其他答案,但找不到我需要的。

4

4 回答 4

4

你没有。它与作证无关——这就是 Go 的工作方式。将多个变量设置为返回值,然后分别断言每个变量:

x, y := testObject.CreateTenantHandler(nil)
assertEqual(t, x, expectedX)
assertEqual(t, y, expectedY)
于 2019-10-10T09:57:49.677 回答
2

问题是您希望将多个返回值转换为一个可供 assert.Equal 使用的值。

您可以通过将多个值传递给可变参数函数来实现此目的,该函数将所有值(无论有多少)转换为单个接口切片。然后将该切片视为单个值,并且与 testify assert.Equal 一起工作得很好。

其他地方提到的 shim 函数很接近,但它有固定数量的参数。下面的 makeIS() 代码更少、更简洁、更简单,并且可以处理任意数量的返回值/参数。将此功能放入您的测试包中。

    // makeIS will convert any number of parameters to a []interface{}
    func makeIS(v ...interface{}) []interface{} {
        return v
    }

现在断言像这样工作

    assert.Equal(t, makeIS(eX,eY), makeIS(iReturnTwoValues())

证人知道如何进行比较,并很好地报告了各个参数的差异。请注意,这具有“看起来像”要使用函数左侧的两个目标值测试的调用的额外好处。

于 2019-11-12T16:25:38.133 回答
0

您可以添加转换功能来修复它

package multi_return

import (
    "github.com/stretchr/testify/assert"
    "testing"
)

func multiReturn() (int, float32) {
    return 1, 2
}

func toSlice(a ...interface{}) []interface{} {
    return a
}

func TestMultiReturn(t *testing.T) {
    assert.Equal(t, []interface{}{int(1), float32(2)}, toSlice(multiReturn()))
}
于 2019-10-10T10:08:33.043 回答
0

做你想做的事情的一种简单方法是声明一个函数,如shim

  func shim(a, b interface{}) []interface{} {
      return []interface{}{a, b}
  }

接着:

  assert.Equal(t, shim(5,6), shim(testObject.CreateTenantHandler(nil)));

该行为在以下链接中进行了详细描述:

来源:http: //zacg.github.io/blog/2014/10/05/go-asserts-and-multiple-return-values/

于 2019-10-10T10:09:58.520 回答