I go-sqlmock verwenden (https://godoc.org/github.com/DATA-DOG/go-sqlmock) eine Funktion zu testen, die eine variable Anzahl von Argumenten erhält (I vereinfacht die meisten der Code die Funktion aus Gründen der Einfachheit und gezupft):Wie go-sqlmock WithArgs() mit einer variablen Anzahl von Argumenten verwenden?
func getHits(db *sql.DB, actions ...string) (hits []Hit, err error) {
// ...
query := `select * from table where action in (?,?)`
rows, err := db.Query(query, actions)
// ...
}
Die Tests suchen wie folgt aus:
// rows := ...
actions := []string{"click", "event"}
mock.ExpectQuery(`^select .*`).WithArgs(actions).WillReturnRows(rows)
hits, err := getHits(db, actions...)
if mockErr := mock.ExpectationsWereMet(); mockErr != nil {
log.Fatalf("there were unfulfilled expections: %s", mockErr)
}
Dann bekomme ich diese Ausgabe:
2017/12/21 10:38:23 there were unfulfilled expections: there is a remaining expectation which was not matched: ExpectedQuery => expecting Query or QueryRow which:
- matches sql: '^select .*'
- is with arguments:
0 - [click event]
- should return rows: ...
Wenn ich die Tests wie folgt zu ändern:
mock.ExpectQuery(`^select .*`).WithArgs(actions[0], actions[1]).WillReturnRows(rows)
Dann bekomme ich diese Ausgabe:
2017/12/21 10:44:41 there were unfulfilled expections: there is a remaining expectation which was not matched: ExpectedQuery => expecting Query or QueryRow which:
- matches sql: '^select .*'
- is with arguments:
0 - click
1 - event
- should return rows:
Das einzige, ich kann es machen passieren durch den Aufruf:
db.Query(query, actions[0], actions[1])
das ist, was ich als ich natürlich nicht tun wollen weiß nicht die Anzahl der Aktionen ...
Hat jemand eine Idee, wie ich das beheben oder debuggen könnte?
Funktioniert 'actions ...' nicht? – Flimzy
@Flimzy nein; der Compiler beschwert sich: 'kann keine Aktionen (type [] string) als type [] driver.Value im Argument zu mock.ExpectQuery ("^select. * ") verwenden. WithArgs' – Cyrille
Konvertiere' actions' in '' [] driver. Wert dann. – Flimzy