我对 Go 相当陌生,在编写测试时遇到了一些问题,特别是模拟包函数的响应。
我正在为 编写一个包装器库github.com/go-redis/redis。目前它确实只有更好的失败错误,但它会随着 statsd 进一步跟踪而扩展,但我离题了......
我创建了以下 go 包
package myredis
import (
"time"
"github.com/go-redis/redis"
errors "github.com/pkg/errors"
)
var newRedisClient = redis.NewClient
// Options - My Redis Connection Options
type Options struct {
*redis.Options
DefaultLifetime time.Duration
}
// MyRedis - My Redis Type
type MyRedis struct {
options Options
client *redis.Client
}
// Connect - Connects to the Redis Server. Returns an error on failure
func (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
}
我的问题是我想redis.NewClient返回一个模拟。这是我写的测试代码,但它不起作用:
package myredis
import (
"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)
}
}
我收到以下错误:cannot use clientMock (type *redisClientMock) as type *redis.Client in return argument。我想我读到我需要模拟 的所有功能,redis.Client以便能够在这种情况下将其用作模拟,但事实真的是这样吗?这似乎太过分了,我应该能够以某种方式做到这一点。我该如何让这个测试工作,或者我是否需要重组我的代码以便更容易编写测试?
千巷猫影
相关分类