2017-12-21 2 views
0

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?

+0

Funktioniert 'actions ...' nicht? – Flimzy

+0

@Flimzy nein; der Compiler beschwert sich: 'kann keine Aktionen (type [] string) als type [] driver.Value im Argument zu mock.ExpectQuery ("^select. * ") verwenden. WithArgs' – Cyrille

+0

Konvertiere' actions' in '' [] driver. Wert dann. – Flimzy

Antwort

0

ich einen Weg gefunden, um mein Problem zu beheben: Wenn ich die Scheibe von Strings zu einer Scheibe von Schnittstellen für db.Query konvertieren, es funktioniert gut:

boundValues := make([]interface{}, len(actions)) 

for i, val := range actions { 
    boundValues[i] = val 
} 

rows, err := db.Query(query, boundValues...) 

Dann für die Tests:

mock.ExpectQuery(`^select .*`).WithArgs(actions[0], actions[1]).WillReturnRows(rows) 

HINWEIS: Passing nur db.Query(query, actions...) funktioniert nicht; das ergibt cannot use actions (type []string) as type []interface {} in argument to db.Query

Verwandte Themen