我们正在尝试测试引发index out of range
错误的函数。
单元测试的代码很简单,类似于:
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestIndexOutOfRange(t *testing.T) {
assert.PanicsWithValue(t, "index out of range", func() { indexOutOfRange(9) })
}
但是不幸的是,测试失败并出现一个奇怪的错误
=== RUN TestIndexOutOfRange
--- FAIL: TestIndexOutOfRange (0.00s)
<autogenerated>:1:
Error Trace: badindex_test.go:55
Error: func (assert.PanicTestFunc)(0x1c440d0) should panic with value: "index out of range"
Panic value: "index out of range"
Test: TestIndexOutOfRange
您可以看到panic值和错误显示相同,但测试仍然失败。
有什么想法吗?
答案 0 :(得分:4)
索引超出范围错误的类型为runtime.errorString
。应用程序将该值与string
类型的值进行比较。比较结果为假。
要解决此问题,请捕获超出范围的索引错误并进行比较。
var indexOutOfRangeValue = func() (v interface{}) {
defer func() {
v = recover()
}()
x := []int{}
return x[1]
}()
func TestIndexOutOfRange(t *testing.T) {
assert.PanicsWithValue(t, indexOutOfRangeValue, func() { indexOutOfRange(9) })
}
此代码假定索引超出范围的紧急值比较相等。无法保证这个假设在Go的未来版本中将是正确的,但是运行时似乎不太可能打破这个假设。