114 lines
3.0 KiB
Go
114 lines
3.0 KiB
Go
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")
|
||
}
|
||
}
|