测试代码中有很多示例隐藏了测试库(如 testify)中的包名称。
例如:
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSomething(t *testing.T) {
assert := assert.New(t)
require := require.New(t)
var a string = "Hello"
var b string = "Hello"
assert.Equal(a, b, "The two words should be the same.")
}
用局部变量覆盖包命名空间的值不应该是一个明确的决定并且很少发生吗?
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSomething(t *testing.T) {
assertions := assert.New(t)
req := require.New(t)
var a string = "Hello"
var b string = "Hello"
assert.Equal(a, b, "The two words should be the same.")
}
我希望正确的行为是给包起别名pkgassert
,我觉得这不是惯用的,或者确保变量没有设置为与包相同的名称:assertions := assert.New(t)
.
其他示例:
好的:buf := bytes.Buffer{}
坏的:bytes := bytes.Buffer{}
注意:我不关注变量命名模式,因为 Go 倾向于推荐单字母或在您可能使用缓冲区的狭窄范围内的短变量。假设由于函数长度,较长的名称是可以接受和需要的。
如果这是测试包中所需的行为,我想知道为什么?它似乎违反了“无魔法”和可读性这一惯用 Go 的关键原则。
如果有由此产生的不良副作用,我也想知道这一点。我的假设是这意味着在导入后,由于变量阴影,对同一范围内的包的任何调用都将不起作用
Go 中的 Scope Shadowing是一本不错的读物,并在使用方面给出了一些重要的观点。我从这个和 Stack 评论者那里得到的主要收获:
它可以增强可读性。(我认为这可能是由于 Go 更喜欢对包进行小而简洁的命名,使 Go 中的包名称可变长度。)
Parallel Test Issues是我记得不久前读过的东西。我不理解通过输入“隐藏”循环变量的建议:
for _, tc := range tests {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
// Here you test tc.value against a test function.
// Let's use t.Log as our test function :-)
t.Log(tc.value)
})
}
}
随着对阴影的更好理解,我看到这个“隐藏”是指通过在循环内分配来隐藏 tc 的调用者范围变量,从而进行阴影。
这似乎是一个很好的用例,尽管我仍然觉得它很“聪明”,而不是没有评论,并且违反了惯用的 Go 目标,即清晰易读,没有“魔法”。
呼如林
慕容森
相关分类