我使用this statsd package
向我们的statsd server
发送指标。要初始化客户端,我在main中调用metrics.Setup()
来执行init。这个包看起来像这样:
包
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.Client.Inc("some.counter", 1, 1.0)
。这工作正常,但现在我的测试文件有问题。当包实际使用metrics package
发送指标时,它们现在会失败。这是显而易见的,因为度量包尚未初始化等等。所以我的问题 - 我认为 - 我如何在我的测试文件中模拟statsd client
?
答案 0 :(得分:1)
我工作的很多项目都使用statsd,并且只是在测试中离开调用之间摇摇欲坠,因为它们非常轻量级,并且对度量接口进行编程(正如您已经完成StasdAccess
)。 / p>
由于接口已经初始化,您应该能够使用该接口来破坏代码中的配置依赖性,并在测试中提供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)
}