第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

從包函數(shù)返回 Mock

從包函數(shù)返回 Mock

Go
拉丁的傳說(shuō) 2023-07-26 15:32:31
我對(duì) Go 相當(dāng)陌生,在編寫(xiě)測(cè)試時(shí)遇到了一些問(wèn)題,特別是模擬包函數(shù)的響應(yīng)。我正在為 編寫(xiě)一個(gè)包裝器庫(kù)github.com/go-redis/redis。目前它確實(shí)只有更好的失敗錯(cuò)誤,但它會(huì)隨著 statsd 進(jìn)一步跟蹤而擴(kuò)展,但我離題了......我創(chuàng)建了以下 go 包package myredisimport (    "time"    "github.com/go-redis/redis"    errors "github.com/pkg/errors")var newRedisClient = redis.NewClient// Options - My Redis Connection Optionstype Options struct {    *redis.Options    DefaultLifetime time.Duration}// MyRedis - My Redis Typetype MyRedis struct {    options Options    client  *redis.Client}// Connect - Connects to the Redis Server. Returns an error on failurefunc (r *MyRedis) Connect() error {    r.client = newRedisClient(&redis.Options{        Addr:     r.options.Addr,        Password: r.options.Password,        DB:       r.options.DB,    })    _, err := r.client.Ping().Result()    if err != nil {        return errors.Wrap(err, "myredis")    }    return nil}我的問(wèn)題是我想redis.NewClient返回一個(gè)模擬。這是我寫(xiě)的測(cè)試代碼,但它不起作用:package myredisimport (    "testing"    "github.com/go-redis/redis"    "github.com/stretchr/testify/assert"    "github.com/stretchr/testify/mock")type redisStatusCmdMock struct {    mock.Mock}func (m *redisStatusCmdMock) Result() (string, error) {    args := m.Called()    return args.Get(0).(string), args.Error(1)}type redisClientMock struct {    mock.Mock}func (m *redisClientMock) Ping() redis.StatusCmd {    args := m.Called()    return args.Get(0).(redis.StatusCmd)}func TestConnect(t *testing.T) {    assert := assert.New(t)    old := newRedisClient    defer func() { newRedisClient = old }()    newRedisClient = func(options *redis.Options) *redis.Client {        assert.Equal("127.0.0.1:1001", options.Addr)        assert.Equal("password", options.Password)        assert.Equal(1, options.DB)    }}我收到以下錯(cuò)誤:cannot use clientMock (type *redisClientMock) as type *redis.Client in return argument。我想我讀到我需要模擬 的所有功能,redis.Client以便能夠在這種情況下將其用作模擬,但事實(shí)真的是這樣嗎?這似乎太過(guò)分了,我應(yīng)該能夠以某種方式做到這一點(diǎn)。我該如何讓這個(gè)測(cè)試工作,或者我是否需要重組我的代碼以便更容易編寫(xiě)測(cè)試?
查看完整描述

1 回答

?
千巷貓影

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊

redis.Client是一種結(jié)構(gòu)類(lèi)型,并且在 Go 中結(jié)構(gòu)類(lèi)型根本不可模擬。然而 Go 中的接口是可模擬的,所以你可以做的是定義你自己的“newredisclient”函數(shù),而不是返回一個(gè)結(jié)構(gòu),而是返回一個(gè)接口。由于 Go 中的接口是隱式滿(mǎn)足的,因此您可以定義接口,以便它可以由 redis.Client 開(kāi)箱即用地實(shí)現(xiàn)。


type RedisClient interface {

    Ping() redis.StatusCmd

    // include any other methods that you need to use from redis

}


func NewRedisCliennt(options *redis.Options) RedisClient {

    return redis.NewClient(options)

}


var newRedisClient = NewRedisClient

如果您還想模擬 的返回值Ping(),則需要做更多的工作。


// First define an interface that will replace the concrete redis.StatusCmd.

type RedisStatusCmd interface {

    Result() (string, error)

    // include any other methods that you need to use from redis.StatusCmd

}


// Have the client interface return the new RedisStatusCmd interface

// instead of the concrete redis.StatusCmd type.

type RedisClient interface {

    Ping() RedisStatusCmd

    // include any other methods that you need to use from redis.Client

}

現(xiàn)在*redis.Client不再滿(mǎn)足接口RedisClient,因?yàn)?的返回類(lèi)型Ping()不同。redis.Client.Ping()請(qǐng)注意, 的結(jié)果類(lèi)型是否滿(mǎn)足 的返回接口類(lèi)型并不重要RedisClient.Ping(),重要的是方法簽名不同,因此它們的類(lèi)型不同。


要解決此問(wèn)題,您可以定義一個(gè)*redis.Client直接使用并滿(mǎn)足新RedisClient接口的瘦包裝器。


type redisclient struct {

    rc *redis.Client

}


func (c *redisclient) Ping() RedisStatusCmd {

    return c.rc.Ping()

}


func NewRedisCliennt(options *redis.Options) RedisClient {

    // here wrap the *redis.Client into *redisclient

    return &redisclient{redis.NewClient(options)}

}


var newRedisClient = NewRedisClient


查看完整回答
反對(duì) 回復(fù) 2023-07-26
  • 1 回答
  • 0 關(guān)注
  • 123 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)