如何使用 mongo-go-driver 模拟光标
How to mock cursor with mongo-go-driver
我刚学了 go 语言,然后用 https://github.com/mongodb/mongo-go-driver 来 make rest API 和 MongoDB 和 Golang 然后我在做单元测试,但我卡住了在模拟 Cursor MongoDB 时,因为 Cursor 是一个结构,是一个想法还是有人制作的?
在我看来,模拟此类对象的最佳方法是定义一个接口,因为在 go 中接口是隐式实现的,您的代码可能不需要那么多更改。一旦你有了一个接口,你就可以使用一些第三方库来自动生成模拟,比如 mockery
有关如何创建界面的示例
type Cursor interface{
Next(ctx Context)
Close(ctx Context)
}
只需更改任何接收 mongodb 光标的函数即可使用自定义界面
我刚 运行 遇到这个问题。因为 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
界面添加新功能。
我刚学了 go 语言,然后用 https://github.com/mongodb/mongo-go-driver 来 make rest API 和 MongoDB 和 Golang 然后我在做单元测试,但我卡住了在模拟 Cursor MongoDB 时,因为 Cursor 是一个结构,是一个想法还是有人制作的?
在我看来,模拟此类对象的最佳方法是定义一个接口,因为在 go 中接口是隐式实现的,您的代码可能不需要那么多更改。一旦你有了一个接口,你就可以使用一些第三方库来自动生成模拟,比如 mockery
有关如何创建界面的示例
type Cursor interface{
Next(ctx Context)
Close(ctx Context)
}
只需更改任何接收 mongodb 光标的函数即可使用自定义界面
我刚 运行 遇到这个问题。因为 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
界面添加新功能。