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

标签 unit-testing go database-testing

<分区>

我有这样的方法:

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

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

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

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

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

最佳答案

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

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

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

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

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

关于unit-testing - 您将如何对一个唯一目的是进行数据库调用的方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47976784/

相关文章:

nhibernate - 我可以在不提交事务的情况下刷新我的 NHibernate session 并获得一个新 session 吗?

java - Spring MVC;测试重定向是否是相对的

java - 对 Swing 组件进行单元测试

string - 这两个err值有什么区别?

sql - 完整的数据库模式转换 - 如何测试重写的查询?

JUnit 数据库测试和测试排序

unit-testing - 在 VS 2013 中使用 HttpClient 代理类对 Web API 进行单元测试

django - 在 Django 中测试 admin.ModelAdmin

go - 在 Go 中强制使用特定的导入路径

gtk - 可以使用 swig 移植 gui 函数