在过去的几天里,我一直试图解决问题,而且我知道我没有足够的洞察力来解决这个问题。
简介
我已将json.NewDecoder(r).Decode(v)
包装在一个看起来像这个
t := new(validTransport)
v := make([]foo, 0)
t.Decode(r, &v)
现在v
包含从r
读取的所有foos。
问题
我的问题是当我尝试对依赖于v
的内容进行单元测试时,如何将设置为validTransport
的值存根。
在我尝试修复此问题时,我已经定义了一个接口Transport
,我的功能将依赖于该接口。
type Transport interface{
Decode(r io.Reader, v interface{})
}
在单元测试中,我定义了一个fakeTransport
并传递它而不是真正的实现。 问题是如何在调用v
时将哪些值设置为Decode
。
我的工作解决方案
我一直在使用testify来模拟我的依赖关系,这提供了一个非常好的api。
代码示例:
type fakeTransport struct{
mock.Mock
stubValue interface{}
}
func (f *fakeTransport) Decode(r io.Reader, v interface{}){
f.Called(r,v) // assert that this function has been called
want := reflect.ValueOf(f.stubValue)
reflect.ValueOf(v).Set(want) //stub my value here
}
问题
所以我的问题是我应该如何处理具有这种签名的方法,使得它们的返回值实际上是输入参数之一。
如果签名是这样的话:
type Transport interface{
Decode(r io.Reader) interface{}
}
然后我将返回我的存根值(但这也会强制执行我不想要的类型断言)。
修改
这是一个伪gist,说明了我目前是如何实现这一目标的。