2017-02-15 9 views
1

sql.Rowsの構造体へのスキャンを実行するテスト/モック関数の良い習慣はありますか?テスト可能なデータベース/ sql sql.Rows in go

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をチェックしましたが、大きなビルドなしで何かを探しています。

この種のテストには良い戦略がありますか?

答えて

0

入力としてインターフェイスを使用することになります。

あなたの場合には、それは次のようになります。

type Scanner interface { 
    Next() 
    Scan(User) 
} 

を関数は次のようになります。あなたが実装モックスキャナを作成することができますので、

func parseUsers(s Scanner) (users []User, err error) { 
    // ... 
} 

今すぐテストは、非常に簡単です。インタフェースを呼び出し、メソッドが呼び出されたパラメータを覚えています。

+0

これはまさに私が探していたものです。私は、構造体の代わりにinterface {}を取るようにスキャナインタフェースのアイデアを変えましたが、私が必要としていたのは正確です。 – TaylorBarrick

関連する問題