Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@prog470dev
Created January 5, 2019 07:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save prog470dev/4247b934b06e60ebe11cf4933853343a to your computer and use it in GitHub Desktop.
Save prog470dev/4247b934b06e60ebe11cf4933853343a to your computer and use it in GitHub Desktop.
simple package
package data
import (
"database/sql"
)
type UserRepositoryImpl struct {
DB *sql.DB
}
type User struct {
ID int
Name string
Age int
}
func (res *UserRepositoryImpl) Get(id int) (*User, error) {
user := &User{}
if err := res.DB.QueryRow("SELECT * FROM user WHERE id = ? LIMIT 1", id).Scan(
&user.ID,
&user.Name,
&user.Age,
); err != nil {
return nil, err
}
return user, nil
}
func (res *UserRepositoryImpl) Put(user *User) error {
_, err := res.DB.Exec("INSERT INTO user (name, age) VALUES (?, ?) ",
user.Name, user.Age)
if err != nil {
return err
}
return nil
}
package service
// Bad: service(内側) から data(外側) への依存(参照)が発生してしまう。
import "golang-test-sample/simple/data"
func ResisterUser(user *data.User, res *data.UserRepositoryImpl) error {
err := res.Put(user)
return err
}
func FetchUser(id int, res *data.UserRepositoryImpl) (*data.User, error) {
user, err := res.Get(id)
if err != nil {
return nil, err
}
return user, nil
}
package service
// Bad: service(内側) のテストにもかかわらず dataやsql(外側)への依存が存在する。
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"golang-test-sample/simple/data"
"testing"
)
func TestUser(t *testing.T) {
cnn, _ := sql.Open("mysql", "root:password@tcp(db:3306)/dbname")
rep := data.UserRepositoryImpl{cnn}
user1 := &data.User{
1,
"Alice",
20,
}
err := ResisterUser(user1, &rep)
if err != nil {
t.Error("error.")
return
}
user2, err := FetchUser(1, &rep)
if user2.ID != 1 || user2.Name != "" || user2.Age != 20 || err != nil {
t.Error("error.")
return
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment