Go Mock postgresql ошибки

Как обсуждалось в этом ответе, я написал код для проверки нарушения уникального ключа:

if err, ok := err.(*pq.Error); ok {
    if err.Code.Name() == "unique_violation" {
        fail(w, http.StatusBadRequest, 0, "Item already exists")
                    return
        }
}

Для написания юнит-тестов мне нужно издеваться над этой ошибкой. Я написал макет для ошибки, как это:

return pq.Error{Code: "unique_violation"}

Но это не совпадает с кодом. Как мне издеваться pq.Error?

2 ответа

Решение

Как отмечено в Годоке, ErrorCode is a five-character error code.err.Code.Name() получает понятную человеку версию ошибки, но сама ошибка должна быть представлена ​​и, таким образом, построена кодом ошибки, который в данном случае равен 23505.

Для тех, у кого есть проблемы с этим, вот что сработало для меня. Несколько лет спустя я столкнулся с похожей проблемой, и этот код работает.

      var errCode *pq.Error
errCode = &pq.Error{
        Code: "23505" ,// unique_violation errorcode
    } 

gomock.EXPECT().
 FooBar(gomock.Any()).Times(1).
 Return(foo{}, errCode)

pq.Error — это структура, определенная в пакете pq, поэтому вам просто нужно инициировать структуру с нужным настраиваемым полем. Это поле ErrorCode. Но это должно быть объявлено как указатель на ошибку, как мы утверждаем в коде.

      err, ok := err.(*pq.Error)

Затем ваша конечная точка позаботится обо всем остальном, утверждая и вызываяName()метод на*pq.Error. Теперь вы можете запускать модульные тесты.

Другие вопросы по тегам