2017-09-02 2 views
0

私は、テストで偽/擬似メソッドが何回呼び出されたかをアサートできることが重要であり、証言のようなものを使用せずにこれを行う最良の方法が何であるか疑問に思っています。私の場合、模擬メソッドへの呼び出しは、再帰呼び出しの結果です。assert_called_once()またはassert_called_xyz()....同等ですか?

私は様々な動物でテーブル駆動のテストをしていると言いますが、Helloは実際にはいくつかのテストでは呼び出されますが、他のテストでは呼び出されないと主張したいと思います。いくつかのケースでは、与えられたテスト(スライス上での反復)に対して複数回呼び出される必要があります。

カウンタを追加して、テーブル駆動型テストでそれをアサーションするだけでよいですか?おそらくもっと良い方法があるように思えます。

私はhelloメソッドにカウンタを追加します...これは対処し、これをチェックするのが適切です。偽のメソッド自体やテストなどで?

type fakeFarmService struct { 
 
\t abc.someFarmServiceInterface 
 
} 
 

 
func (f *fakeFarmService) Hello(ctx context.Context, in *abc.FarmRequest) (*abc.FarmResponse, error) { 
 
\t if in.GetAnimal() == Monkey { 
 
\t \t return &abc.HelloResponse{}, nil 
 
\t } 
 
\t return nil, errors.New("an error") 
 
}

答えて

1

私は、構造体の上にカウンターのアプローチを使用して、過去にパッケージレベルのユニットテスト内で複数回、それを主張してきました。それでも、おそらくパッケージのレベルまで、あなたはそのような内部の主張をテストしたいと思うでしょう。私はそれがGoでこれを行うための受け入れられた方法だと信じています。グローバル変数を使用するか、テストを同時に実行する場合は、カウンタへのアクセスを適切に同期させることに注意してください。

package main 

import (
    "fmt" 
    "sync" 
    "testing" 
) 

type fakeable interface { 
    Hello() 
} 

type fakeFarmService struct { 
    mu  sync.Mutex 
    counter int 
} 

func (f *fakeFarmService) Hello() { 
    f.mu.Lock() 
    f.counter++ 
    f.mu.Unlock() 
} 

func helloCaller(callee fakeable) { 
    callee.Hello() 
} 

func TestCallingTheHello(t *testing.T) { 
    fakeSvc := &fakeFarmService{} 
    helloCaller(fakeSvc) 
    helloCaller(fakeSvc) 

    // we expect that Hello method of fakeable was called 2 times 
    fakeSvc.mu.Lock() 
    defer fakeSvc.mu.Unlock() 
    if c := fakeSvc.counter; c != 2 { 
     t.Errorf("unexpected call count, want 2, got %d", c) 
    } 
} 

func main() { 
    TestCallingTheHello(&testing.T{}) 
} 

https://play.golang.org/p/RXKuLKIZwc

  1. Testing Techniques by Andrew Gerrand
  2. NewStore TechTalk - Advanced Testing with Go by Mitchell Hashimoto
行くに高度な試験に

いくつかの良い材料を(テストエラーが遊び場の内部で動作しません)

関連する問題