0

As discussed in this answer, I have written code for checking a unique key violation:

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

For writing unit-testcases, I need to mock this error. I have written the mock for the error like this:

return pq.Error{Code: "unique_violation"}

But this does not matches with the code. How do I mock the pq.Error?

Arun
  • 1,933
  • 2
  • 28
  • 46

2 Answers2

5

As noted in the Godoc, ErrorCode is a five-character error code. err.Code.Name() gets the human-friendly version of the error, but the error itself should be represented, and thus constructed, by the error code, which in this case is 23505.

Carson Hoffman
  • 361
  • 2
  • 11
0

For anyone having issues with this, here is what worked for me. I was going through similar issue years later and this is the code that works.

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

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

pq.Error is a struct defined in the pq package, so you just have to initiate the struct with the custom field you want. This is the ErrorCode field. But this must be declared as a pointer to the Error just as we are asserting in the code.

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

Your endpoint then takes care of the rest by asserting and calling the Name() method on the *pq.Error. Now you can run your unit tests.

Dassy Areg
  • 15
  • 8