Files
reflux/errors_example_test.go
T
what 659fc10bae fix: 修正 Example 函数命名与输出注释位置,让 go vet / go test 恢复可用
go vet ./... 此前有 13 处失败, 导致 go test ./...(默认带 vet)根本跑不起来,
必须加 -vet=off。这是既存问题, 与实现改动无关。

命名问题(12 处): Example 函数名的前缀必须是包内真实存在的标识符。
  ExampleStructMap_*  -> ExampleR_*         (包里没有 StructMap)
  ExampleSet_*        -> ExampleR_Set_*     (Set 是 R 的方法, 不是包级函数)
  ExampleAppend_*     -> ExampleR_Append_*  (同上)
  ExampleSchema_Unmarshal -> ExampleSchema_unmarshalJSON
                                            (Schema 没有 Unmarshal 方法,
                                             这个例子演示的是 json.Unmarshal)

输出注释位置(1 处): ExampleR_Append_typeConversionError 的 // Output: 后面
还跟着一条注释, 违反"Output 必须是最后一个注释块"。因为格式不合法, Go 一直
没把它当输出例子比对 —— 里面写的期望输出其实是错的(与实际信息不符)也没被发现。
把注释挪到 defer 之前, 并把期望输出更正为真实的 panic 信息。
已验证: 故意改错期望输出现在会导致测试失败, 说明确实在比对了。

现在 go vet ./... 干净, go test ./... 无需 -vet=off 即可运行。
2026-08-28 17:02:56 +08:00

151 lines
3.5 KiB
Go

package reflux_test
import (
"fmt"
"git.fsdpf.net/go/reflux"
)
// ExampleR_Set_errorMessages 演示设置失败时的详细错误信息
func ExampleR_Set_errorMessages() {
type Person struct {
Name string
Age int
}
p := &Person{Name: "Alice", Age: 30}
r := reflux.New(p)
// 示例1: 类型不匹配错误 - 显示原有类型和传入值的类型
defer func() {
if rec := recover(); rec != nil {
fmt.Println("错误:", rec)
// 输出类似: rfx: set failed at path 'Age': cannot convert value of type map[string]int to target type int: ...
}
}()
// 尝试将 map 设置为 int 类型字段,会显示详细的类型转换错误
r.Set("Age", map[string]int{"invalid": 123})
}
// ExampleR_Set_fieldNotFound 演示字段不存在的错误信息
func ExampleR_Set_fieldNotFound() {
type Person struct {
Name string
Age int
}
p := &Person{Name: "Bob", Age: 25}
r := reflux.New(p)
defer func() {
if rec := recover(); rec != nil {
fmt.Println(rec)
// Output: rfx: set failed at path 'InvalidField': rfx: field not found, 'InvalidField' in struct reflux_test.Person
}
}()
r.Set("InvalidField", "value")
}
// ExampleR_Set_sliceIndexOutOfRange 演示切片索引越界的错误信息
func ExampleR_Set_sliceIndexOutOfRange() {
type Data struct {
Items []int
}
d := &Data{Items: []int{1, 2, 3}}
r := reflux.New(d)
defer func() {
if rec := recover(); rec != nil {
fmt.Println(rec)
// Output: rfx: set failed at path 'Items.10': rfx: index out of range, slice index 10 (len=3)
}
}()
r.Set("Items.10", 999)
}
// ExampleR_Set_unexportedField 演示未导出字段的错误信息
func ExampleR_Set_unexportedField() {
type Person struct {
Name string
age int // 未导出字段
}
p := &Person{Name: "Charlie"}
r := reflux.New(p)
defer func() {
if rec := recover(); rec != nil {
fmt.Println(rec)
// Output: rfx: set failed at path 'age': rfx: cannot set value, field 'age' (type: int) (unexported or not addressable)
}
}()
r.Set("age", 40)
}
// ExampleR_Append_typeConversionError 演示 Append 时的类型转换错误
func ExampleR_Append_typeConversionError() {
type Data struct {
Items []int
}
d := &Data{Items: []int{1, 2, 3}}
r := reflux.New(d).Get("Items")
// 尝试追加无法转换为 int 的 map
defer func() {
if rec := recover(); rec != nil {
fmt.Println(rec)
// Output: rfx: failed to append item at index 0 to slice: rfx: cannot convert, value of type map[string]int to target type int: unable to cast map[string]int{"invalid":123} of type map[string]int to int
}
}()
r.Append(map[string]int{"invalid": 123})
}
// ExampleR_Set_nestedPathError 演示嵌套路径中的错误信息
func ExampleR_Set_nestedPathError() {
type Address struct {
City string
}
type Person struct {
Name string
Address Address
}
p := &Person{
Name: "David",
Address: Address{City: "NYC"},
}
r := reflux.New(p)
defer func() {
if rec := recover(); rec != nil {
fmt.Println(rec)
// Output: rfx: set failed at path 'Address.Country': rfx: field not found, 'Country' in struct reflux_test.Address
}
}()
r.Set("Address.Country", "USA")
}
// ExampleR_Set_successfulTypeConversion 演示成功的类型转换
func ExampleR_Set_successfulTypeConversion() {
type Person struct {
Name string
Age int
}
p := &Person{Name: "Eve", Age: 20}
r := reflux.New(p)
// 字符串 "30" 可以成功转换为 int
r.Set("Age", "30")
fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
// Output: Name: Eve, Age: 30
}