2017-09-02 152 views
0

對我來說,能夠斷言我的測試中調用了多少次假/嘲笑方法是非常重要的,我想知道在不使用諸如testify之類的情況下做到這一點的最佳方法是什麼。就我而言,對模擬方法的調用是一些遞歸調用的結果。assert_called_once()或assert_called_xyz()....相當於?

可以說我有各種動物的表驅動測試,我想斷言你好實際上是要求一些測試,但不是爲其他人。在某些情況下,對於給定的測試,應該多次調用它(迭代切片)。

添加一個計數器並在我的表驅動測試中作出斷言是否合適?在我看來,也許有更好的方法來做到這一點。

如果我的確向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
(測試誤差不會操場內工作)

一些好的材料上先進的檢測