【问题标题】:Mock statsd client in Go test packageGo 测试包中的模拟 statsd 客户端
【发布时间】:2018-06-03 19:47:45
【问题描述】:

我使用thisstatsd package 将指标发送到我们的statsd server。为了初始化客户端,我在我的 main 中调用了一个 metrics.Setup() 来执行初始化。这个包看起来像这样:

包装:

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】:

    我从事的许多项目都使用 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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 2021-12-12
      • 1970-01-01
      相关资源
      最近更新 更多