我有一个ClassRepository结构,我想测试查询ClassesForLastNDays。我正在使用Gorp连接到数据库,但我无法找到一种测试查询的好方法。现在似乎我必须向数据库添加数据,但这非常痛苦,因为我需要填充不必要的字段和FK等以使我的测试工作。也许不应该测试存储库?
package repositories
import (
"mobifit/app/domain/entities"
)
type ClassRepository struct {
*Repository
}
func (c *ClassRepository) ClassesForLastNDays(days int) []entities.Class {
classes := make([]entities.Class, 0)
query := Select("*").
From("Class").
Where("VisibleAt > CURRENT_TIMESTAMP() - INTERVAL ? DAY").
OrderBy("ClassTypeId").
Sql()
c.Repository.Select(classes, query, days)
c.populateClassRelationships(classes)
return classes
}
func (c *ClassRepository) populateClassRelationships(classes []entities.Class) {
for i := range classes {
class := classes[i]
// ClassType
c.Repository.GetById(&class.ClassType, class.ClassTypeId)
// Instructor
c.Repository.GetById(&class.Instructor, class.ClassType.InstructorId)
// Equipment
query := Select("E.*").
From("Equipment E").
Join("ClassEquipment CE on E.Id = CE.EquipmentId").
Where("CE.ClassId = ?").
Sql()
c.Repository.Select(&class.Equipment, query, class.Id)
}
}
答案 0 :(得分:2)
编写集成测试以涵盖您的查询代码非常有意义。种子和访问数据库需要花费更多的时间和精力,但它让您相信您的代码不会在生产中中断。此安全网还将在未来帮助您进行GORM或数据库升级/迁移。
集成测试位于系统边界,您无法进行单元测试。它们通常比单元测试运行得慢,所以只覆盖所需的最小值。 (记住test pyramid)
夹具是编写可重用数据种子的好习惯。内存数据库可以加速测试运行。