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

问题描述 投票:0回答:1

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

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

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

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

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

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

unit-testing go database-testing
1个回答
2
投票

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

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

  1. 模拟以预期的格式接收预期的数据(即它是否接收到&alert值,传递给它的Insert()方法?)
  2. 模拟的返回值(error)返回给函数的调用者

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

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