go:在其输入参数中输出结果的存根方法

时间:2016-02-01 10:15:45

标签: unit-testing reflection go

在过去的几天里,我一直试图解决问题,而且我知道我没有足够的洞察力来解决这个问题。

简介

我已将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,说明了我目前是如何实现这一目标的。

0 个答案:

没有答案