在Go测试包中模拟statsd客户端

问题描述 投票:0回答:1

我使用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

go interface mocking statsd
1个回答
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)
}
© www.soinside.com 2019 - 2024. All rights reserved.