下面是一个示例代码,该代码返回多个值。
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) );
我还检查了其他答案,但找不到我需要的东西。
答案 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/