首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试mGo

单元测试mGo
EN

Stack Overflow用户
提问于 2014-04-09 00:49:56
回答 2查看 4K关注 0票数 6

我有一个接受database *mgo.Database参数的函数。

代码语言:javascript
复制
func myFunc(db *mgo.Database) {
// does some operations with db
}

我想写一个单元测试,并传入一个模拟的db对象,但我很难弄清楚如何用golang做到这一点。在其他语言中,我可以使用这些测试框架来做myMock = createMock("Class to Mock"),但对于Go,我不确定如何做到这一点。

我看了一眼gomock,但不确定这是不是唯一的方法,也不确定如何将mockgen工具与mgo一起使用。

我还想过也许可以编写一个具有所有与mgo.Database相同的方法的接口,并传递一个使用该接口的“模拟”对象,然后创建一个使用该接口并将调用传递给mgo的库的对象(类似于ORM),但这似乎需要大量的代码。

EN

回答 2

Stack Overflow用户

发布于 2014-04-09 04:21:22

*mgo.Database是指向一个类型的指针,而不是一个接口,你不能模仿它。

就像在其他语言中一样-你需要提供一定程度的间接性,这样你就可以在生产中提供一个真实的对象,而不是一个用于测试的模拟对象。因此,您的第一步是提取您的"myFunc“使用的接口(它调用哪些方法),然后您可以在生产环境中提供*mgo.Database和您的模拟(手动模拟或使用模拟框架)进行测试。

“单元测试的艺术”一书中的这一免费示例章节解释了您需要在第52页上执行的步骤(第3章,“使用存根打破依赖”- "3.3确定如何轻松测试LogAnalyzer"):

http://www.manning.com/osherove/SampleChapter3.pdf

假设在Go中,一个类型仅仅通过实现接口的方法来实现接口--它甚至比在其他语言中(比如C# )更容易。

所以答案就像你说的那样

来编写一个接口,该接口具有与mgo.Database相同的所有方法,并传递一个使用该接口的“模拟”对象,然后创建一个使用该接口并将调用传递给mgo的库(类似于对象关系映射)的对象,但这似乎需要大量的代码。

除了您不需要create an object that uses the interface and passes calls through to mgo's library (similar to an ORM)之外,因为*mgo.Database将隐式地满足您的接口。所以这并不需要太多的编码。

票数 6
EN

Stack Overflow用户

发布于 2016-03-02 07:50:59

你也可以在你的单元测试中使用Docker。

我已经创建了一个库来帮助这种测试:https://github.com/skarllot/raiqub

示例:https://github.com/raiqub/data/blob/v0.4/mongostore/store_test.go

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22943392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档