Comments (1)
Hi @raxod502-plaid! Thank you for your report. You are right that it shouldn't panic, that's a bug. It is also true that Exec
would be preferable for executing any SQL that will never return any rows, like TRUNCATE
.
Quick facts:
- A
Query
/QueryRow
is expected to always return at least one RowSet. - An
Exec
is like aQuery
/QueryRow
whose RowSets are discarded (but has other properties). - The panic happens because it tries to look for the first RowSet and the code doesn't check that there is none. This is the bug you describe.
Correct usage:
- The recommendation for your code is to use
Exec
as you found out. That's not a workaround, your code will benefit from explicitly stating that you are not expecting any RowSets to be returned, and additionally you may get asql.Result
(with rows affected and last inserted ID) if your driver supports it and if it makes sense for the operation. - For code that could potentially return rows (like a
SELECT
,INSERT .. RETURNING
, etc.), the correct expectation to be set isWillReturnRows(mock.NewRows(colNames))
. This tells the mock that one RowSet is expected. - It is valid to use
WillReturnRows(mock.NewRows(nil))
, because it states that you will expect exactly one RowSet with no columns, which is equivalent to anExec
discarding thesql.Result
.
Consider a more complex example:
const myQuery := `
SELECT disabled FROM users WHERE id = ?;
DELETE FROM logins WHERE created_at < ?;
`
tx.QueryContext(ctx, myQuery, theID, theTimestamp)
That's a query returning two RowSets, the first one with a single column, and the second with none. A test expectation for it would be like:
mock.ExpectQuery(myQuery).WithoutArgs().WillReturnRows(
mock.NewRows([]string{"disabled"}),
mock.NewRows(nil),
)
Conclusions:
sqlmock
should not panic this way if WillReturnRows
is not passed any arguments. Instead, it should provide a help message explaining that it expects at least one (non-nil) argument to WillReturnRows
. It should also not panic if NextResultSet
is called and there is none provided, but instead fail the test stating that a call to that method was not expected (didn't check if that's already in place, just saying).
from go-sqlmock.
Related Issues (20)
- how to mock mock preload HOT 1
- Getting 'Query: could not match actual sql' on identical queries HOT 2
- gordor.options PrefetchCount\FetchArraySize HOT 1
- please provide GORM example HOT 1
- using lowercase for installation
- feature: Add WithTxOptions() to ExpectBegin
- Issue with JSON Byte matching HOT 1
- Unable to Mock Rows with `[]string` Type Using Custom ValueConverter HOT 2
- How can I make sqlmock not care about the order of arguments? HOT 1
- Even though I type mock.ExpectBegin(), I get db transaction begin error HOT 2
- "Issue Testing Row Scan Error with go-sqlmock: Uncovered Error Handling in Repository Function HOT 1
- Improve panic output with rows.AddRow HOT 2
- test a call to a procedure HOT 1
- How to mock an update with returning HOT 2
- Breaking change in v1.5.1 HOT 5
- Argument matching for queries using unpacked slices HOT 1
- When expectedSQL is empty it is matching with any query HOT 1
- Mock columnsWithAlias HOT 1
- How to mock multiple query cases HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from go-sqlmock.