我有一个方法target interface{}
在我用于数据库访问的类型上,例如:
func (c *client) Query(query someType, target interface{}) error {
return c.db.Query(query).Decode(target)
}
然后这被称为
result := resultType{}
if err := c.Query(myQuery, &result); err == nil {
// do sth with result
}
当我传递指针地址时,它会执行我想要的操作result
我现在遇到的麻烦是我不知道如何在测试中模拟这种行为(改变传递的引用)。
如果我不需要通过interface{}
我可以想象它是这样完成的:
type mockClient struct {
targetValue resultType
}
func (m *mockClient) Query(query someType, target *resultType) error {
*target = m.targetValue
return nil
}
如果我尝试使用我的实际签名执行相同的操作,我将无法取消引用中包含的值target
像这样:
type mockClient struct {
targetValue interface{}
}
func (m *mockClient) Query(query someType, target interface{}) error {
target = m.targetValue // this does not mutate the passed target
return nil
}
当指针值作为空接口传入时,我可以取消引用它吗?如果不可能,测试我的方法的副作用而不必诉诸具体类型作为参数的另一种方法是什么?