我有类似的方法:
func (alert *Alert) CreateAlert(db *mgo.Database) error {
return db.C("alerts").Insert(&alert)
}
我应该如何进行单位测试?如果我只是调用此方法进行Uni测试,那么我将必须创建呼叫的测试DB。我以某种方式觉得这将是集成测试的一部分,因为我们正在呼吁DB。
如果我模拟了DB对象,则将永远不会测试实际实现。
我应该对此进行测试吗?作为编写单元测试的主要目标,是否将数据插入DB,并且此功能已经在库本身中进行了测试,在我的情况下,MGO库。
请分享您对单元测试上述情况最佳方法的想法。
您将用模拟对其进行单位测试,以便未调用数据库,但仅对您的功能进行了测试。
有许多不同的方法来模拟数据库,因此我不会详细介绍,但是对于如此小的功能的单位测试也很小。您真正要测试的只是:
- 模拟以预期格式接收预期数据(即,它接收到
&alert
值,传递给其Insert()
方法吗?) - 模拟的返回值(一个
error
)返回到函数的呼叫者
特别是在此功能的单元测试中,您将检查:
- SQL符合语法期望(您的功能无法控制SQL,此类测试确实是在测试您的数据层/ORM)
- 插入如预期的 - 这将在您的数据库中测试
- 该函数的呼叫者具有适当的数据库权限(这再次是测试您的数据层和/或数据库)