0

我有这样的方法:

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

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

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

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

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

4

1 回答 1

2

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

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

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

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

  • SQL 符合语法预期(您的函数不控制 SQL,这样的测试实际上是在测试您的数据层/ORM)
  • INSERT 按预期发生-这将测试您的数据库
  • 该函数的调用者具有适当的数据库权限(这再次测试您的数据层和/或数据库)
于 2017-12-26T11:03:47.767 回答