【发布时间】:2017-09-29 04:09:14
【问题描述】:
我是 Golang 的新手,在学习该语言时一直采用 TDD 方法。我一直相处得很好,但我发现测试第三方软件包非常笨拙,这让我相信我采取了错误的方法。
我遇到问题的具体情况是模拟 Redis client 以进行错误处理。我采取的方法是创建自己的接口,实现包装我要使用的客户端方法。
type Redis interface {
Get(key string) (string, error)
}
type RedisClient struct {
client *redis.Client
}
func (redisClient *RedisClient) New(client *redis.Client) *RedisClient {
redisClient.client = client
return redisClient
}
func (redisClient *RedisClient) Get(key string) (string, error) {
return redisClient.client.Get(key).Result()
}
然后我可以创建一个模拟来实现相同的接口以返回我指定的任何值,特别是用于测试错误处理。
我遇到了一个障碍,客户端上的特定方法 perform transactions (MULTI) 返回属于该包的另一个接口。在这种情况下我会怎么做?自己实现该接口似乎是不可能的。
同样,随着该客户端使用量的增长,我自己的实现可能会增长到实现 Redis 的整个接口——这似乎违背了将其委托给外部依赖项的整个想法。
有没有更好的方法来测试这样的第三方包,例如错误处理?
【问题讨论】:
-
为什么对您来说似乎不可能?我认为声明一个由
redis.Pipeline实现的新接口并让您的RedisClient.TxPipeline方法返回该接口而不是redis.Pipeline是非常好的。 -
你最终得出了什么结论?我也有类似的困境。
-
@Lansana 我的方法基本上如下,集成测试涵盖与任何依赖项的交互。对于非 Redis 特定的东西,或者任何无法通过集成测试进行测试的东西,mkopriva 的建议也有效。
-
愿意分享一个你的 Redis 实现的虚拟示例吗?