我有一个接受database *mgo.Database参数的函数。
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),但这似乎需要大量的代码。
发布于 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将隐式地满足您的接口。所以这并不需要太多的编码。
发布于 2016-03-02 07:50:59
你也可以在你的单元测试中使用Docker。
我已经创建了一个库来帮助这种测试:https://github.com/skarllot/raiqub
示例:https://github.com/raiqub/data/blob/v0.4/mongostore/store_test.go
https://stackoverflow.com/questions/22943392
复制相似问题