测试/模拟将sql.Rows扫描成结构的函数有没有好的做法?
func parseUsers(r *sql.Rows) (users []User, err error) {
for r.Next() {
var u User
if err = r.Scan(&u.Username,
&u.DisplayName,
&u.EmailAddress,
&u.IsEnabled,
&u.PhoneNumber); err != nil {
return []User{}, err
}
users = append(users, u)
}
err = r.Err()
return
}但是尝试做一些类似的事情:
func TestParseUsers(t *testing.T) {
//make mock sql.Rows
u, err := parseUsers(fakeRows)
//Do tests...
}我看过sqlx,但希望保留数据库/sql结构。我检查了go-sqlmock,但我正在寻找没有大量积聚的东西。
对于这类测试,有没有好的策略?
发布于 2017-02-16 00:21:42
go的方法是使用一个接口作为输入。
在您的示例中,它可能如下所示:
type Scanner interface {
Next()
Scan(User)
}该函数应如下所示:
func parseUsers(s Scanner) (users []User, err error) {
// ...
}现在测试非常简单,因为您可以创建一个mock scanner,它实现接口并记住调用方法时使用的参数。
https://stackoverflow.com/questions/42253698
复制相似问题