2017-12-21 44 views
0

나는 statsd server에 메트릭스를 보내기 위해 thisstatsd package을 사용합니다. 클라이언트를 초기화하기 위해서, 나는 초기화를하는 내 메인에 metrics.Setup()을 호출한다. 이 패키지는 다음과 같습니다모의 테스트 패키지에 포함 된 모의 테스트 클라이언트

패키지 metrics.Client.Inc("some.counter", 1, 1.0) : 다른 패키지는이 작업을 수행하여이 글로벌 클라이언트하지만 통계를 보낼에이 순간부터

package metrics 

import (
    "fmt" 

    "github.com/cactus/go-statsd-client/statsd" 
) 

// Client can be used to send stats to 
var Client StatsdAccess 

// Setup initialises metrics gathering 
func Setup() { 
    if Client == nil { 
     prefix := fmt.Sprintf("app.%s", logging.GetHost()) 
     std, err := statsd.NewBufferedClient(fmt.Sprintf("localhost:1234", prefix, 0, 0) 
     if err != nil { 
      logrus.Errorf("unable to dial the statsd host: %q", err) 
      return 
     } 
     Client = std 
    } 
} 

// StatsdAccess is used as interface to statsd functions 
type StatsdAccess interface { 
    Inc(stat string, value int64, rate float32) error 
    Gauge(stat string, value int64, rate float32) error 
    Timing(stat string, delta int64, rate float32) error 
} 

. 이 잘 작동하지만 지금은 내 테스트 파일에 문제가 있습니다. 패키지가 실제로 metrics package을 사용하여 메트릭을 보낼 때 오류가 발생합니다. 메트릭 패키지가 초기화되지 않았기 때문에 이것은 명백합니다. 제 질문 - 생각합니다 : statsd client을 테스트 파일에 어떻게 조롱 할 수 있습니까?

답변

1

내가 사용하는 많은 프로젝트는 statsd를 사용하며, 가볍고 메트릭 인터페이스 프로그래밍을하기 때문에 (예 : StasdAccess처럼) 테스트에서 호출을 남겨 두는 것에서부터 시작되었습니다.

인터페이스가 이미 초기화되어 있기 때문에, 당신이 당신의 테스트에 사용하기 위해 test implementation을 코드에서 구성 의존성을 깰 인터페이스를 사용하여 제공 할 수 있어야합니다 :

package_metrics/ 
    testing.go 

// testing.go 

type StubStatsd struct {} 
func (s StubStatsd) Inc(stat string, value int64, rate float32) error { 
    return nil 
} 
func (s StubStatsd) Gauge(... 
func (s StubStatsd) Timing(... 

테스트가 StatsdAccess 매개 변수가 필요한 구성 요소를 초기화하거나 메서드를 호출하려면 테스트 스텁을 사용하여 요구 사항을 충족 할 수 있습니다.

func TestSomething_NeedsStatsd(t *testing.T) { 
    statsdStub := StubStatsd{} 
    someMethodThatRequiresStatsd(stasdStub) 
}