前提・実現したいこと
Golangで書いたコードのテストを書いています。
別パッケージからメソッドを呼び出す部分でエラーが発生してしまい、テストがfailします。
この部分エラー解消法を教えていただきたいです。
発生している問題・エラーメッセージ
dao_test.go
のテストを実行すると以下のエラーが発生して、テストがfailします。
command
1$ go test -v 2--- FAIL: TestDaoSuite (0.00s) 3 --- FAIL: TestDaoSuite/TestDeleteArticleDao (0.00s) 4 dao_test.go:221: 5 Error Trace: dao_test.go:221 6 suite.go:122 7 panic.go:522 8 panic.go:82 9 signal_unix.go:390 10 s3.go:66 11 dao.go:74 12 dao_test.go:156 13 Error: Received unexpected error: 14 there is a remaining expectation which was not matched: ExpectedBegin => expecting database transaction Begin 15 Test: TestDaoSuite/TestDeleteArticleDao 16 suite.go:61: test panicked: runtime error: invalid memory address or nil pointer dereference
該当のソースコード
フォルダ構成
article ├ client ├ api │ ├ main.go │ ├ contoroller │ │ ├ contoroller.go │ │ └ contoroller_test.go │ ├ service │ │ ├ service.go │ │ └ service_test.go │ ├ dao │ │ ├ dao.go │ │ └ dao_test.go │ ├ s3 │ │ ├ s3.go │ │ └ s3_test.go │ ├ go.mod │ ├ go.sum │ └ Dockerfile ├ nginx └ docker-compose.yml
dao_test.go
go
1package dao 2 3// import 4 5type DaoSuite struct { 6 suite.Suite 7 db *sql.DB 8 mock sqlmock.Sqlmock 9 dao *Dao 10 s3 *s3.S3 11} 12 13func (s *DaoSuite) SetupTest() { 14 15 var err error 16 s.db, s.mock, err = sqlmock.New() 17 s.Require().NoError(err) 18 s.dao = NewDao(s.db, s.s3) 19} 20 21func (s *DaoSuite) TestDeleteArticleDao() { 22 23 // some method 24 25 // DeleteArticleDaoは別パッケージのメソッドのため、呼び出しの際に落ちてしまいます。 26 s.dao.DeleteArticleDao("1") 27} 28 29func (s *DaoSuite) TearDownTest() { 30 s.db.Close() 31 s.Assert().NoError(s.mock.ExpectationsWereMet()) 32}
dao.go
go
1package dao 2 3// import 4 5type Dao struct { 6 database *sql.DB 7 s3 *s3.S3 8} 9 10func NewDao(database *sql.DB, s3 *s3.S3) *Dao { 11 objs := &Dao{database: database, s3: s3} 12 return objs 13} 14 15func (d *Dao) DeleteArticleDao(id string) { 16 //imageNameの生成 17 18 //ここで、別パッケージのメソッドを呼び出しています。ここでテストが落ちます。 19 d.s3.DeleteS3Image(imageName) 20 21}
s3.go
go
1package s3 2 3//import 4 5type S3 struct { 6 APPID string 7 SECRET string 8} 9 10type DaoInterface interface { 11 DeleteS3Image(imageName util.ImageName) error 12} 13 14func NewS3(appid, secret string) *S3 { 15 objs := &S3{APPID: appid, SECRET: secret} 16 return objs 17} 18 19//このメソッドがうまく呼び出せずに落ちています。おそらくモックにすべきなのですが方法がわかっていません。 20func (objs *S3) DeleteS3Image(imageName util.ImageName) error { 21 // method 22}
補足情報(FW/ツールのバージョンなど)
・client: react/axios ・api: golang/gin ・web-server: nginx ・db: mysql ・container: docker ・ci-tool: travis ・deploy: aws elastic beanstalk
以上お手数ですが、ご教授いただけると幸いです。よろしくお願いいたします。
追記(全ソース版)
上記3ファイルの全ソースを追記いたします。
文字数制限に引っかかるため、コードは以下のgithubをご参照下さい。(ブランチ:fix-test-dao
)
https://github.com/jpskgc/article/tree/fix-test-dao
以上よろしくお願いいたいます。
回答1件
あなたの回答
tips
プレビュー