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

断言指向字符串的指针切片包含预期字符串的正确方法?

断言指向字符串的指针切片包含预期字符串的正确方法?

Go
墨色风雨 2022-12-26 10:29:47
是否有一种简单而紧凑的方法使用 Testify 来断言一段指向字符串的指针包含指向符合我期望的字符串的指针?想象一下,您正在从函数调用(可能来自 API)中获取一段指向字符串的指针,并且您想要验证它是否包含指向您期望的字符串的指针。为了模拟这一点,我将制作一个测试数据结构来说明我的观点:// Shared Fixturevar one = "one"var two = "two"var three = "three"var slice = []*string{&one, &two, &three}现在我想编写一个断言切片包含预期值的测试。我可以写这个测试:func TestSliceContainsString(t *testing.T) {    assert.Contains(t, slice, "one")}它不起作用:[]*string{(*string)(0x22994f0), (*string)(0x2299510), (*string)(0x2299500)} does not contain "one"。有道理,切片包含指向字符串的指针,而字符串“one”不是这些指针之一。我可以先转换它。它需要更多代码,但它有效:func TestDereferencedSliceContainsString(t *testing.T) {    deref := make([]string, len(slice))    for i, v := range slice {        deref[i] = *v    }    assert.Contains(t, deref, "one")}我也可以按照我的期望传递一个指向字符串的指针:func TestSliceContainsPointerToExpectation(t *testing.T) {    expect := "one"    assert.Same(t, &one, &one)    assert.NotSame(t, &one, &expect)    // How can I assert that they contain values    assert.Contains(t, slice, &expect)}老实说,这还不错。我可以断言对字符串的引用(指向不同的内存位置)包含我期望的值。这条路径的主要烦恼是我无法传递对文字的引用,这会占用更少的空间:func TestSliceContainsString(t *testing.T) {    assert.Contains(t, slice, &"one")}还有其他我没有考虑的方法吗?golang / testify 中的其中一个更惯用吗?
查看完整描述

1 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

是的,不幸的是&"one"语法无效(几年前,我打开了一个允许该语法的问题;它被关闭了,尽管 Rob Pike最近打开了一个类似的问题)。


现在,我认为最好的方法是只获取一个变量的地址,就像在你的TestSliceContainsPointerToExpectation. 或者,如果你经常这样做,你可以编写一个简单的stringPtr函数,这样你就可以把它作为一个单行代码来完成:


func stringPtr(value string) *string {

    return &value

}


func TestSliceContainsString(t *testing.T) {

    assert.Contains(t, slice, stringPtr("one"))

}

或者,如果你至少使用 Go 1.18(带有泛型),你可以创建一个泛型ptr函数:


func ptr[T any](value T) *T {

    return &value

}


func TestSliceContains(t *testing.T) {

    assert.Contains(t, slice, ptr("one"))

}

在 Go Playground 中查看这些。


查看完整回答
反对 回复 2022-12-26
  • 1 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

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