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

hjzp0vay  于 2023-10-14  发布在  Go
关注(0)|答案(3)|浏览(129)

我刚学了go语言,然后用https://github.com/mongodb/mongo-go-driver为MongoDB和Golang的make rest API做了一个单元测试,但我在模拟Cursor MongoDB时卡住了,因为Cursor是一个结构体,是一个想法还是有人做的?

64jmpszr

64jmpszr1#

在我看来,模拟这类对象的最好方法是定义一个接口,因为在go中接口是隐式实现的,你的代码可能不需要那么多修改。一旦有了接口,就可以使用第三方库来自动生成模拟,比如mockery
关于如何创建接口的示例

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

只需将任何接收MongoDB游标的函数更改为使用自定义接口即可

bjg7j2ky

bjg7j2ky2#

我刚刚遇到了这个问题。因为mongo.Cursor有一个内部字段保存[]byte--Current,所以为了完全模拟,需要 Package 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接口添加新功能。

ej83mcc0

ej83mcc03#

您可以使用mongo驱动程序包中的NewCursorFromDocuments函数。
go.mongodb.org/mongo-driver/mongo"

type Emp struct {
    Name string
    Age  int
}

var emp1 = Emp{
    Name: "John",
    Age:  30,
}
    
dbDataInterface := []interface{}{
      emp1,
    }

cursor, err := mongo.NewCursorFromDocuments(dbDataInterface, nil, nil)

相关问题