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
. Теперь вы можете запускать модульные тесты.