【问题标题】:How to add Clone and Copy functions in mocking MongoDB in Go?如何在 Go 中模拟 MongoDB 时添加克隆和复制功能?
【发布时间】:2018-10-08 21:44:21
【问题描述】:

我读过这个article,它有很好的在 Go 中模拟 MongoDB 的指南。但是Clone()Copy() 方法存在一些问题。 我创建了这个接口和结构:

type ISession interface {
    DB(name string) IDatabase
    Close()
    Clone() ISession
    Copy() ISession
}

type IDatabase interface {
    C(name string) ICollection
}

type MongoSession struct {
    dbSession *mgo.Session
}

func (s MongoSession) DB(name string) IDatabase {
    return &MongoDatabase{Database: s.dbSession.DB(name)}
}

func (s MongoSession) Clone() ISession {
    //return session.clone
    return s.dbSession.Clone()
}

func (s MongoSession) Copy() ISession {
    return s.dbSession.Copy()
}

但我得到了这个错误

不能使用 s.dbSession.Clone() (type *mgo.Session) 作为 type ISession in 返回参数:*mgo.Session 没有实现 ISession(类型错误 对于 Clone 方法)有 Clone() *mgo.Session 想要 Clone() ISession

不能使用 s.dbSession.Copy() (type *mgo.Session) 作为 type ISession in 返回参数:*mgo.Session 没有实现 ISession(类型错误 对于 Clone 方法)有 Clone() *mgo.Session 想要 Clone() ISession

如何将Clone()Copy() 方法添加到接口?

【问题讨论】:

    标签: mongodb go mgo


    【解决方案1】:

    MongoSession.Copy()MongoSession.Clone() 必须返回一个实现ISession 的值。基本上你创建MongoSession 类型正是为了这个:实现ISession

    mgo.Session 没有实现你的ISession 接口(例如,因为它的Session.Clone() 方法的返回类型是*mgo.Session 而不是ISession)。您应该创建并返回一个新值MongoSession,您可以在其中包装复制或克隆的*mgo.Session 值。

    像这样:

    func (s MongoSession) Clone() ISession {
        return MongoSession{dbSession: s.dbSession.Clone()}
    }
    
    func (s MongoSession) Copy() ISession {
        return MongoSession{dbSession: s.dbSession.Copy()}
    }
    

    【讨论】:

    • 谢谢。有用。在 Go 中模拟 MongoDB 是正确的方法吗?另一个问题是每次我调用 Copy 方法时它都会返回新对象。这不是问题吗?
    • 这种模拟不一定是最好的解决方案,但它是一个可行的、可行的解决方案。
    • 并且调用Copy() 不会造成麻烦,只要您完成后不要忘记使用其Close() 方法关闭副本。但你必须关闭它!
    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多