Модульное тестирование Голанга с использованием PanicsWithValue - PullRequest
0 голосов
/ 09 апреля 2019

Мы пытаемся протестировать функцию, которая вызывает ошибку 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

Вы можете видеть, чтозначение паники и ошибка показывают то же самое, но тест все равно не проходит.
Есть идеи, что происходит?

1 Ответ

4 голосов
/ 09 апреля 2019

Ошибка индекса вне диапазона имеет тип 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, но маловероятно, что среда выполнения нарушит это предположение.

...