如何接收 testify 框架 "assert" 方法中的方法返回的多个值作为参数?
How to receive multiple values returned by a method in testify framework "assert" method as an argument?
下面是一个示例代码,它返回多个值。
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) );
我也检查了其他答案,但找不到我需要的东西。
你不知道。它与 testify 无关——这就是 Go 的工作方式。将多个变量设置为 return 值,然后分别声明每个变量:
x, y := testObject.CreateTenantHandler(nil)
assertEqual(t, x, expectedX)
assertEqual(t, y, expectedY)
你可以添加转换函数来修复它
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()))
}
一个简单的方法来做你想做的事情是声明一个像 shim
:
这样的函数
func shim(a, b interface{}) []interface{} {
return []interface{}{a, b}
}
然后:
assert.Equal(t, shim(5,6), shim(testObject.CreateTenantHandler(nil)));
下面的 link 中详细描述了该行为:
来源:http://zacg.github.io/blog/2014/10/05/go-asserts-and-multiple-return-values/
问题是您想要将多个 return 值转换为一个可供 assert.Equal 使用的值。
您可以通过将多个值传递给可变参数函数来实现这一点,该函数将所有值(无论有多少)转换为单个接口片段。然后该切片被视为单个值,并且与 testify assert.Equal.
一起工作得很好
别处提到的shim函数很接近,但是参数个数固定。下面的 makeIS() 代码更少、更干净、更简单,并且适用于任意数量的 return values/parameters。将此功能放入您的测试包中。
// 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())
作证者知道如何进行比较,并能很好地报告各个参数的差异。请注意,这具有额外的好处 "looking like" 您要使用函数左侧的两个目标值测试的调用。
下面是一个示例代码,它返回多个值。
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) );
我也检查了其他答案,但找不到我需要的东西。
你不知道。它与 testify 无关——这就是 Go 的工作方式。将多个变量设置为 return 值,然后分别声明每个变量:
x, y := testObject.CreateTenantHandler(nil)
assertEqual(t, x, expectedX)
assertEqual(t, y, expectedY)
你可以添加转换函数来修复它
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()))
}
一个简单的方法来做你想做的事情是声明一个像 shim
:
func shim(a, b interface{}) []interface{} {
return []interface{}{a, b}
}
然后:
assert.Equal(t, shim(5,6), shim(testObject.CreateTenantHandler(nil)));
下面的 link 中详细描述了该行为:
来源:http://zacg.github.io/blog/2014/10/05/go-asserts-and-multiple-return-values/
问题是您想要将多个 return 值转换为一个可供 assert.Equal 使用的值。
您可以通过将多个值传递给可变参数函数来实现这一点,该函数将所有值(无论有多少)转换为单个接口片段。然后该切片被视为单个值,并且与 testify assert.Equal.
一起工作得很好别处提到的shim函数很接近,但是参数个数固定。下面的 makeIS() 代码更少、更干净、更简单,并且适用于任意数量的 return values/parameters。将此功能放入您的测试包中。
// 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())
作证者知道如何进行比较,并能很好地报告各个参数的差异。请注意,这具有额外的好处 "looking like" 您要使用函数左侧的两个目标值测试的调用。