Closed rafareyes7 closed 3 months ago
@rafareyes7 Do you have a reproducible demo?
@navono yes, I just edited the post and add a GO Playgound Running example
@rafareyes7: I had the same issues. The problem seems to be with special character, like (..)
of $1
:
func TestMock(t *testing.T) {
query := "insert into test_table (first, second) values ($1, $2)"
db, mock, err := sqlmock.New()
if err != nil {
t.Fatal(err)
}
mock.ExpectExec(query).WillReturnResult(driver.ResultNoRows)
if _, err := db.Exec(query); err != nil {
t.Error(err)
}
mock.ExpectClose()
db.Close()
}
I tried the following values for query
:
"insert into test_table (first, second) values ($1, $2)"
-> fails"insert into test_table (first, second) values"
-> fails"insert into test_table values $1"
-> fails"insert into test_table values"
-> works!The default QueryMatcher
is a regex one. And I assume that its not playing well with those characters. I didn't really dig into the sources, but found changing the QueryMatcher
for a simple compare check does the trick! Changing the QueryMatcher
is documented here: https://godoc.org/github.com/DATA-DOG/go-sqlmock#QueryMatcher
@muhlemmer I've experienced similar issue when using brackets () on my query. Is it work if you escaping the brackets or special characters?
for example:
insert into test_table \\(first, second\\) values
Also need to escape characters like ?
and *
I have the same error, no solution seems to work
also you need to escape $
characters
insert into test_table \(first, second\) values \(\$1, \$2\)
@ehduardu If your INSERT is RETURNing check if you are expecting a query rather than exec.
Hi @rafareyes7! sqlmock
uses the standard library's regexp package. An alternative to workaround the differences that Postgres drivers have that they use positional parameters (i.e. $1
, $2
, etc.) instead of the standard SQL92 question mark ?
is to use the following snippet: ([?]|[$][0-9]+)
instead of the positional $n
or the ?
.
This is just an untested example of how to use regular expressions. Please, refer to the linked standard regexp package for reference.
Thank you!
Hi, I'm trying to run an unit test that executes an INSERT into DB, so I mocked exactly the same query string that the gorm log displays with the same arguments but I'm still having problem while trying to execute the test, (with postgres driver)
It seems like the sql-mock does not match the SQL that I defined in the mock and display an error like:
"call to Query 'INSERT INTO "customer" ("customer_key","first_name","middle_name","last_surname") VALUES ($1,$2,$3,$4) RETURNING "customer"."customer_key"' with args [{Name: Ordinal:1 Value:RLKuxK-wnj8SUn50iFMjsrCtikTLTEmUFP7fOSE2veI=} {Name: Ordinal:2 Value:Martín} {Name: Ordinal:3 Value:Constan} {Name: Ordinal:4 Value:Smith}] was not expected "
GO Playgound Running example
repository.go
repository_test.go
and I get the following error:
I'm using the following versions:
github.com/DATA-DOG/go-sqlmock v1.4.0 github.com/jinzhu/gorm v1.9.11
I would appreciate any help...