为了账号安全,请及时绑定邮箱和手机立即绑定

如何接收 testify 框架“assert”方法中的方法返回的多个值作为参数?

如何接收 testify 框架“assert”方法中的方法返回的多个值作为参数?

Go
翻阅古今 2023-07-26 20:04:36
下面是一个返回多个值的示例代码。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 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

你不知道。它与 testify 无关——这就是 Go 的工作原理。将多个变量设置为返回值,然后单独断言每个变量:

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


查看完整回答
反对 回复 2023-07-26
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

问题是您希望将多个返回值转换为可由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())

作证者非常清楚如何进行比较并报告各个参数的差异。请注意,这还有一个额外的好处,即“看起来像”您想要使用函数左侧的两个目标值来测试的调用。


查看完整回答
反对 回复 2023-07-26
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

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

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

进而:

  assert.Equal(t, shim(5,6), shim(testObject.CreateTenantHandler(nil)));
查看完整回答
反对 回复 2023-07-26
?
米脂

TA贡献1836条经验 获得超3个赞

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


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

}


查看完整回答
反对 回复 2023-07-26
  • 4 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信