如何在作证框架“声明”方法中接收方法返回的多个值作为参数?

时间:2019-10-10 09:51:26

标签: go testify

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

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 个答案:

答案 0 :(得分:2)

你不知道。它与作证无关-这就是Go的工作方式。将多个变量设置为返回值,然后分别声明每个变量:

x, y := testObject.CreateTenantHandler(nil)
assertEqual(t, x, expectedX)
assertEqual(t, y, expectedY)

答案 1 :(得分:1)

问题是您想将多个返回值转换为assert.Equal可用的单个值。

您可以通过将多个值传递给可变参数函数来实现,该函数将所有值(无论多少)都转换为单个接口片。然后将该片视为单个值,并与作证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())

见证者知道如何进行比较并很好地报告各个参数的差异。请注意,这样做还有一个好处,就是您可以使用函数左侧的两个目标值来“看起来像”要测试的调用。

答案 2 :(得分:0)

您可以添加convert函数对其进行修复

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()))
}

答案 3 :(得分: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/