🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Q&A

解決済

1回答

2986閲覧

Goのテストが別パッケージからのメソッド呼び出し失敗が原因でfailします

jpskgc

総合スコア19

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

0グッド

1クリップ

投稿2019/09/07 01:54

編集2019/09/07 09:32

前提・実現したいこと

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

以上よろしくお願いいたいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobonobo

2019/09/07 08:18

色々引用が省略されているため、せっかくのエラー情報が役にたちません。例:dao_test.goの162行目で起こったエラーの該当行がわかりません。 エラーメッセージだけで問題を推測する事を要求するのなら基本全て貼ってください。(あらかじめ見せたくない部分をカットしたバージョンを作り、その全てを貼り、そのバージョンで出たエラーメッセージも貼ってください)
jpskgc

2019/09/07 09:33

githubリンクを追加いたしました。よろしくお願い致します。
guest

回答1

0

自己解決

以下のように修正して解決いたしました。

dao_test.go

go

1type MockDaoInterface struct { 2} 3 4func (_m *MockDaoInterface) PostImageToS3(file *multipart.FileHeader, imageName string) error { 5 return nil 6} 7 8func (_m *MockDaoInterface) DeleteS3Image(imageName util.ImageName) error { 9 return nil 10} 11 12type DaoSuite struct { 13 suite.Suite 14 db *sql.DB 15 mock sqlmock.Sqlmock 16 s3 s3.DaoInterface 17 dao *Dao 18} 19 20func (s *DaoSuite) SetupTest() { 21 22 var err error 23 s.db, s.mock, err = sqlmock.New() 24 s.Require().NoError(err) 25 s.dao = NewDao(s.db, s.s3) 26 s.dao.s3 = &MockDaoInterface{} 27}

dao.go

go

1type Dao struct { 2 database *sql.DB 3 s3 s3.DaoInterface 4} 5 6func NewDao(database *sql.DB, s3 s3.DaoInterface) *Dao { 7 objs := &Dao{database: database, s3: s3} 8 return objs 9}

投稿2019/09/08 11:50

jpskgc

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問