如何使用mongo-go-driver模拟光标

时间:2019-09-28 05:14:37

标签: mongodb go mongo-go

我刚刚学习了Go语言,然后使用https://github.com/mongodb/mongo-go-driver来与MongoDB和Golang一起使用make rest API,然后进行单元测试,但是在模拟Cursor MongoDB时会卡住,因为Cursor是一个结构体,对此有想法还是有人创造了?

2 个答案:

答案 0 :(得分:0)

我认为,模拟此类对象的最佳方法是定义一个接口,因为在go接口中隐式实现了您的代码,可能不需要太多更改。有了界面后,您可以使用一些第三方库来自动生成模拟,例如mockery

有关如何创建界面的示例

type Cursor interface{
  Next(ctx Context)
  Close(ctx Context)  
}

只需更改接收mongodb游标的任何函数即可使用自定义界面

答案 1 :(得分:0)

我只是遇到了这个问题。因为mongo.Cursor有一个内部字段,其中包含[]byte-Current,所以要完全模拟,您需要包装mongo.Cursor。这是我执行此操作的类型:

type MongoCollection interface {
    Find(ctx context.Context, filter interface{}, opts ...*options.FindOptions) (MongoCursor, error)
    FindOne(ctx context.Context, filter interface{}, opts ...*options.FindOneOptions) MongoDecoder
    Aggregate(ctx context.Context, pipeline interface{}, opts ...*options.AggregateOptions) (MongoCursor, error)
}

type MongoDecoder interface {
    DecodeBytes() (bson.Raw, error)
    Decode(val interface{}) error
    Err() error
}

type MongoCursor interface {
    Decode(val interface{}) error
    Err() error
    Next(ctx context.Context) bool
    Close(ctx context.Context) error
    ID() int64
    Current() bson.Raw
}

type mongoCursor struct {
    mongo.Cursor
}

func (m *mongoCursor) Current() bson.Raw {
    return m.Cursor.Current
}

不幸的是,这将是一个移动的目标。随着时间的流逝,我将不得不向MongoCollection界面添加新功能。