【问题标题】:Mocking mgo chaining functions模拟 mgo 链接函数
【发布时间】:2018-02-24 21:47:24
【问题描述】:

在测试我的一些代码库时,我发现使用接口模拟“gopkg.in/mgo.v2”中的对象很有用。我遇到了一个问题,mgo.Query 没有实现我的接口 Query。

import mgo "gopkg.in/mgo.v2"

type Collection interface {
    FindId(interface{}) Query
    Find(interface{}) Query
    UpdateId(interface{}, interface{}) error
    Update(interface{}, interface{}) error
    UpsertId(interface{}, interface{}) (interface{}, error)
    Insert(...interface{}) error
    RemoveId(interface{}) error
}

type Query interface {
    One(interface{}) error
    All(interface{}) error
    Select(interface{}) Query
}

var _ Query = (*mgo.Query)(nil)

查询转换引发了错误:

cannot use (*mgo.Query)(nil) (type *mgo.Query) as type Query in assignment:
    *mgo.Query does not implement Query (wrong type for Select method)
        have Select(interface {}) *mgo.Query
        want Select(interface {}) Query

这是无法在接口中定义链函数的问题吗?我不确定如何制作与 mgo 实现匹配的 Select 标头。

【问题讨论】:

    标签: go interface mocking mgo


    【解决方案1】:

    函数签名不同,这就是您遇到编译错误的原因。你的接口版本Select返回yourQuery类型,而mgo的Select返回*mgo.Query,这是一个不同的类型。即使该类型确实实现了您的接口,函数签名仍然不同。您需要在其中添加另一层,以便能够包装 mgo 包。

    type MgoQuery struct {
        *mgo.Query
    }
    
    func (q *MgoQuery) Select(selector interface{}) Query {
        return q.Query.Select(selector)
    }
    
    ...
    

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多