用于测试存储库的Golang策略

时间:2014-01-22 10:42:56

标签: go

我有一个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)
    }
}

1 个答案:

答案 0 :(得分:2)

编写集成测试以涵盖您的查询代码非常有意义。种子和访问数据库需要花费更多的时间和精力,但它让您相信您的代码不会在生产中中断。此安全网还将在未来帮助您进行GORM或数据库升级/迁移。

集成测试位于系统边界,您无法进行单元测试。它们通常比单元测试运行得慢,所以只覆盖所需的最小值。 (记住test pyramid

夹具是编写可重用数据种子的好习惯。内存数据库可以加速测试运行。