gin-base/db/core/dao_test.go

114 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package core
import (
"reflect"
"testing"
)
// TestDAO_Columns 测试 Columns 方法
func TestDAO_Columns(t *testing.T) {
// 创建测试模型
type TestModel struct {
ID int64 `json:"id" db:"id"`
Name string `json:"name" db:"name"`
Email string `json:"email" db:"email"`
Status int64 `json:"status" db:"status"`
Password string `json:"password" db:"password"` // 应该有 db 标签
}
// 创建 DAO 实例(带模型类型)
dao := NewDAOWithModel(nil, &TestModel{})
// 调用 Columns 方法(不需要参数)
result := dao.Columns()
// 验证返回的是指针类型
if result == nil {
t.Fatal("Columns 返回 nil")
}
// 获取类型信息
resultType := reflect.TypeOf(result)
if resultType.Kind() != reflect.Ptr {
t.Errorf("期望返回指针类型,得到 %v", resultType.Kind())
}
// 获取元素类型
elemType := resultType.Elem()
// 验证字段数量(应该过滤掉没有 db 标签的字段)
expectedFields := 5 // id, name, email, status, password
if elemType.NumField() != expectedFields {
t.Errorf("期望 %d 个字段,得到 %d 个", expectedFields, elemType.NumField())
}
// 验证每个字段的类型都是 string
for i := 0; i < elemType.NumField(); i++ {
field := elemType.Field(i)
// 验证字段类型
if field.Type.Kind() != reflect.String {
t.Errorf("字段 %d 应该是 string 类型,得到 %v", i, field.Type.Kind())
}
// 验证有 db 标签
dbTag := field.Tag.Get("db")
if dbTag == "" {
t.Errorf("字段 %d 缺少 db 标签", i)
}
t.Logf("字段 %d: %s -> db:%s", i, field.Name, dbTag)
}
}
// TestDAO_Columns_WithPtr 测试传入指针的情况
func TestDAO_Columns_WithPtr(t *testing.T) {
type TestModel struct {
ID int64 `json:"id" db:"id"`
Name string `json:"name" db:"name"`
}
dao := NewDAOWithModel(nil, &TestModel{})
// 调用 Columns 方法(不需要参数)
result := dao.Columns()
if result == nil {
t.Error("传入指针时返回 nil")
}
resultType := reflect.TypeOf(result)
if resultType.Kind() != reflect.Ptr {
t.Error("传入指针时应返回指针类型")
}
}
// TestDAO_Columns_WithoutDBTag 测试没有 db 标签的字段会被过滤
func TestDAO_Columns_WithoutDBTag(t *testing.T) {
type TestModel struct {
ID int64 `json:"id" db:"id"` // 有 db 标签
Name string `json:"name" db:"name"` // 有 db 标签
Temporary string `json:"-"` // 没有 db 标签,应该被过滤
}
dao := NewDAOWithModel(nil, &TestModel{})
result := dao.Columns()
resultType := reflect.TypeOf(result).Elem()
// 应该只有 2 个字段ID 和 Name
if resultType.NumField() != 2 {
t.Errorf("期望 2 个字段(过滤掉没有 db 标签的),得到 %d 个", resultType.NumField())
}
}
// TestDAO_Columns_NilModel 测试没有设置模型类型的情况
func TestDAO_Columns_NilModel(t *testing.T) {
dao := NewDAO(nil) // 不使用 NewDAOWithModel
result := dao.Columns()
if result != nil {
t.Error("没有设置模型类型时应该返回 nil")
}
}