使用 PanicsWithValue 进行 Golang 单元测试

Golang unit testing using PanicsWithValue

我们正在尝试测试引发 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值和error一样,但是测试还是失败
有什么想法吗?

索引超出范围错误的类型为 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 的未来版本中会成立,但运行时似乎不太可能打破此假设。