您如何对一个只能进行数据库调用的方法进行单元测试?

时间:2017-12-26 09:58:01

标签: unit-testing go database-testing

我有类似这样的方法(golang):

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

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

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

我应该测试一下吗?作为编写单元测试的主要目标,如果数据是否插入到数据库中,并且这些功能已经在库本身中进行了测试,在我的情况下是mgo库。

请分享您对上述情景进行单元测试的最佳方法的看法。

1 个答案:

答案 0 :(得分:2)

您可以使用模拟对其进行单元测试,以便不调用数据库,但只测试您的函数。

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

  1. 模拟以预期格式接收预期数据(即它是否收到&alert值,传递给其Insert()方法?)
  2. 模拟的返回值(error)返回给函数的调用者
  3. 特别是,在此功能的单元测试中,您检查:

    • SQL符合语法期望(您的函数不控制SQL,这样的测试真的会测试您的数据层/ ORM)
    • INSERT按预期发生 - 这将测试您的数据库
    • 该函数的调用者具有适当的数据库权限(这再次测试您的数据层和/或数据库)