Golangのunitテストで、transactionのエラーが発生する。

実現したいこと

Golangのunitテストのエラーを解決したい。

前提

golangでクリーンアーキテクチャに基づいて実装しています。
repository層の中の、SaveRefreshTokenというrefresh tokenをDBに保存するメソッドのunitテストでエラーが発生しています。
ちなみに、このメソッド以外のunitテストは成功しているので、テストの設定等には問題はなさそうです。

発生している問題・エラーメッセージ

GOROOT=/opt/homebrew/Cellar/go/1.20.2/libexec #gosetup GOPATH=/Users/haji/go #gosetup /opt/homebrew/Cellar/go/1.20.2/libexec/bin/go test -c -o /private/var/folders/_5/z7_l4csd659802b3j17jlvqc0000gn/T/GoLand/___TestSaveRefreshToken__uReserve_repository__.test uReserve/repository #gosetup /opt/homebrew/Cellar/go/1.20.2/libexec/bin/go tool test2json -t /private/var/folders/_5/z7_l4csd659802b3j17jlvqc0000gn/T/GoLand/___TestSaveRefreshToken__uReserve_repository__.test -test.v -test.paniconexit0 -test.run ^\QTestSaveRefreshToken\E$ === RUN TestSaveRefreshToken --- FAIL: TestSaveRefreshToken (0.00s) === RUN TestSaveRefreshToken/正常系:リフレッシュトークンを保存できる user_repository_test.go:123: Error Trace: /Users/haji/Desktop/Deveropment/udemy/uReserve/repository/user_repository_test.go:123 Error: Received unexpected error: Code: internal_server, Msg: failed to save refresh_token by internal server error: all expectations were already fulfilled, call to database transaction Begin was not expected; invalid transaction Test: TestSaveRefreshToken/正常系:リフレッシュトークンを保存できる --- FAIL: TestSaveRefreshToken/正常系:リフレッシュトークンを保存できる (0.00s) FAIL プロセス が終了コード 1 で終了しました

該当のソースコード

golang

1//user_repository.go 2 3func (ur *userRepository) SaveRefreshToken(user *model.User, userId uint, refreshToken string) error { 4 result := ur.db.Updates(user).Where("id=?", userId).Update("refresh_token", refreshToken) 5 if result.Error != nil { 6 return API.Errorf(code.InternalServer, "failed to save refresh_token by internal server error: %s", result.Error) 7 } 8 if result.RowsAffected < 1 { 9 return API.Errorf(code.NoRows, "failed to save refresh_token by no rows") 10 } 11 return nil 12}

golang

1//test_config.go 2 3package repository 4 5import ( 6 "database/sql" 7 "database/sql/driver" 8 "github.com/DATA-DOG/go-sqlmock" 9 "gorm.io/driver/postgres" 10 "gorm.io/gorm" 11 "time" 12) 13 14type AnyTime struct{} 15 16// Match satisfies sqlmock.Argument interface 17func (a AnyTime) Match(v driver.Value) bool { 18 _, ok := v.(time.Time) 19 return ok 20} 21 22func NewDbMock() (*sql.DB, *gorm.DB, sqlmock.Sqlmock, error) { 23 database, mock, err := sqlmock.New() 24 gormDB, err := gorm.Open( 25 postgres.New( 26 postgres.Config{ 27 Conn: database, 28 }), &gorm.Config{}) 29 return database, gormDB, mock, err 30} 31

補足情報(FW/ツールのバージョンなど)

github.com/DATA-DOG/go-sqlmock v1.5.0
github.com/stretchr/testify v1.8.4
testing

コメントを投稿

0 コメント