您将如何对一个唯一目的是进行数据库调用的方法进行单元测试?

How would you unit test a method whose only purpose to make a database call?

我有这样的方法:

func (alert *Alert) CreateAlert(db *mgo.Database) error {
    return db.C("alerts").Insert(&alert)
}

我应该如何对此进行单元测试? 如果我只是调用此方法进行 uni 测试,那么我将不得不创建调用的测试数据库。我不知何故觉得这将是集成测试的一部分,因为我们正在调用 DB。

如果我模拟 db 对象,那么它永远不会测试实际的实现。

我是否应该对此进行测试?作为编写单元测试的主要目标,是否将数据插入数据库,并且此类功能已经在库本身中进行了测试,在我的例子中是 mgo 库。

请分享您对以上场景进行单元测试的最佳方法的想法。

您可以使用模拟对其进行单元测试,这样就不会调用数据库,而只会测试您的函数。

模拟数据库的方法有很多种,所以我不会详细介绍,但是这么小的功能的单元测试也会很小。您真正要测试的是:

  1. mock 以预期格式接收预期数据(即它是否接收 &alert 值,传递给它的 Insert() 方法?)
  2. mock 的 return 值(一个 error)被 returned 给函数的调用者

特别是,在此函数的单元测试中,您不会检查:

  • SQL符合语法预期(你的函数不控制SQL,这样的测试真的是在测试你的数据layer/ORM)
  • INSERT 按预期发生——这将测试您的数据库
  • 该函数的调用者具有适当的数据库权限(这再次测试您的数据层 and/or 数据库)