質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Go

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

コールバック

コールバックは他のコードに引数として渡されるコードのことを指します。

ユニットテスト

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Q&A

解決済

1回答

1381閲覧

Golang コールバック関数のテストが通らない

ikutyan46

総合スコア18

Go

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

コールバック

コールバックは他のコードに引数として渡されるコードのことを指します。

ユニットテスト

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

0グッド

0クリップ

投稿2021/03/17 07:52

編集2021/03/17 14:02

解決したいこと

初歩的な質問ですみません。golangでユーザー定義した関数を引数に取る関数のテストを書いているのですが、main_test.goで書いた値が、関数の引数に代入されません。これはなぜそうなってしまうのでしょうか?

###main.go

go

1package main 2 3import "fmt" 4 5// debugツールで、a,bの値を見ると、a=0,b=0になっている 6// var a,b intを消すと、undeclared name: ~t怒られる 7func hoge(x int, f func(a, b, x int) int) int { 8 var a,b int 9 return f(a,b,x) 10} 11 12 13func fuga(a, b, x int) int { 14 return a*x + b 15} 16 17func main() { 18 ret := hoge(2, fuga) 19 fmt.Println(ret) 20} 21

###main_test.go

go

1package main 2 3import ( 4 "testing" 5) 6 7func TestLinearFunction(t *testing.T) { 8 tests := []struct { 9 a int 10 b int 11 x int 12 expected int 13 }{ 14 {1,1,1,2},{2,1,1,3},{1,2,1,3},{1,1,2,3}, 15 {2,2,1,4},{2,1,2,5},{1,2,2,4},{2,2,2,6}, 16 } 17 18 for _, test := range tests { 19 result := hoge(test.x,fuga) 20 if result != test.expected { 21 t.Errorf("input: a=%d b=%d x=%d, expected:%d, got:%d",test.a,test.b,test.x,test.expected,result) 22 } 23 } 24}

test結果

go

1--- FAIL: TestLinearFunction (0.00s) 2input: a=1 b=1 x=1, expected:2, got:0 3input: a=1 b=1 x=1, expected:3, got:0 4input: a=1 b=1 x=1, expected:3, got:0 5input: a=1 b=1 x=1, expected:3, got:0 6 7・・・以後も取得するのは「0

実際にPASSしたコード

main.go

go

1package main 2 3import "fmt" 4 5func hoge(a, b, x int, f func(int, int, int) int) int { 6 return f(a, b, x) 7} 8 9func fuga(a, b, x int) int { 10 return a*x + b 11} 12// 一例 13func main() { 14 ret := hoge(1,2,3, fuga) 15 fmt.Println(ret) 16} 17

main_test.go

go

1package main 2 3import ( 4 "testing" 5) 6 7func TestLinearFunction(t *testing.T) { 8 tests := []struct { 9 a int 10 b int 11 x int 12 expected int 13 }{ 14 {1,1,1,2},{2,1,1,3},{1,2,1,3},{1,1,2,3}, 15 {2,2,1,4},{2,1,2,5},{1,2,2,4},{2,2,2,6}, 16 } 17 18 for _, test := range tests { 19 result := hoge(test.a,test.b,test.x,fuga) 20 if result != test.expected { 21 t.Errorf("input: a=%d b=%d x=%d, expected:%d, got:%d",test.a,test.b,test.x,test.expected,result) 22 } 23 } 24}

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

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

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

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

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

guest

回答1

0

ベストアンサー

hogeの引数fの型宣言は関数型でa,b,xの引数が書かれていますがこれは
関数型宣言のための仮引数です。

go

1func hoge(x int, f func(a, b, x int) int)

fを実際に呼ぶときのパラメータは別途必要です。

fの型宣言におけるa, b, x仮引数といってただの「わかりやすいタグ」なので省略できます。
どこかで、テストデータのa,bと勘違いしているのだと思います。
仮引数を省略しても別の名前にしてもコンパイルは通るのでお試しください。
以下のように書いても良いわけです。

go

1func hoge(x int, f func(int, int, int) int) { 2 ... 3}

return f(a,b,x)のxは実引数xが渡されているのでエラーにはなりませんが、
a,bは実引数がないのでエラーになります。

var a,b intという宣言はゼロ値で初期化されたa,bが作られるだけです。
テストデータのtestsにある値のaやbをhogeやfugaに渡している引数がないのでこのままの
現状のhogeの実装では期待したテスト結果にはなりません。

hogeの実装は以下のようになっている必要があると思います。

go

1func hoge(a, b, x int, f func(int, int, int) int) int { 2 return f(a, b, x) 3}

投稿2021/03/17 12:04

編集2021/03/17 12:13
nobonobo

総合スコア3367

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

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

ikutyan46

2021/03/17 14:00

「何を渡して、何を期待するのか」自分でも考え直し、無事にテストコードもPASSして理解できていることを確認できました。nobonoboさん、仮引数・実引数の関係など詳細なご説明、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問