sql_mapping_tag_test.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. package test
  2. import (
  3. "git.sxidc.com/go-framework/baize/framework/core/tag/sql/sql_mapping"
  4. "git.sxidc.com/go-tools/utils/encoding"
  5. "git.sxidc.com/go-tools/utils/strutils"
  6. "github.com/pkg/errors"
  7. "math/rand"
  8. "reflect"
  9. "strings"
  10. "testing"
  11. )
  12. type SqlMappingTagStruct struct {
  13. Ignore string `sqlmapping:"-"`
  14. Column string `sqlmapping:"column:test_column"`
  15. Key string `sqlmapping:"key"`
  16. NotUpdate string `sqlmapping:"notUpdate"`
  17. UpdateClear string `sqlmapping:"updateClear"`
  18. Aes string `sqlmapping:"aes:@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L"`
  19. JoinWith []string `sqlmapping:"joinWith:##"`
  20. Trim string `sqlmapping:"trim:||"`
  21. TrimPrefix string `sqlmapping:"trimPrefix:{{"`
  22. TrimSuffix string `sqlmapping:"trimSuffix:}}"`
  23. WrongAes int `sqlmapping:"aes:@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L"`
  24. WrongJoinWith string `sqlmapping:"joinWith:##"`
  25. WrongTrim int `sqlmapping:"trim:||"`
  26. WrongTrimPrefix int `sqlmapping:"trimPrefix:{{"`
  27. WrongTrimSuffix int `sqlmapping:"trimSuffix:}}"`
  28. }
  29. func (s SqlMappingTagStruct) checkFields(t *testing.T, fields []sql_mapping.Field) {
  30. if len(fields) != reflect.TypeOf(s).NumField()-1 {
  31. t.Fatalf("%+v\n", errors.Errorf("有字段没有被解析"))
  32. }
  33. for _, field := range fields {
  34. if field.FieldName == "Ignore" || field.ColumnName == "ignore" {
  35. t.Fatalf("%+v\n", errors.Errorf("忽略字段没有被忽略"))
  36. }
  37. switch field.FieldName {
  38. case "Column":
  39. if s.Column != field.Value {
  40. t.Fatalf("%+v\n", errors.Errorf("值不正确: fieldName: %v, fieldValue %v, tagValue %v",
  41. field.FieldName, s.Column, field.Value))
  42. }
  43. if field.ColumnName != "test_column" {
  44. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  45. field.FieldName, field.ColumnName))
  46. }
  47. case "Key":
  48. if field.ColumnName != "key" {
  49. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  50. field.FieldName, field.ColumnName))
  51. }
  52. if s.Key != field.Value {
  53. t.Fatalf("%+v\n", errors.Errorf("值不正确: fieldName: %v, fieldValue %v, tagValue %v",
  54. field.FieldName, s.Key, field.Value))
  55. }
  56. if !field.IsKey {
  57. t.Fatalf("%+v\n", errors.Errorf("key解析错误"))
  58. }
  59. case "NotUpdate":
  60. if field.ColumnName != "not_update" {
  61. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  62. field.FieldName, field.ColumnName))
  63. }
  64. if s.NotUpdate != field.Value {
  65. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  66. field.FieldName, s.NotUpdate, field.Value))
  67. }
  68. if field.CanUpdate {
  69. t.Fatalf("%+v\n", errors.Errorf("notUpdate解析错误"))
  70. }
  71. case "UpdateClear":
  72. if field.ColumnName != "update_clear" {
  73. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  74. field.FieldName, field.ColumnName))
  75. }
  76. if s.UpdateClear != field.Value {
  77. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  78. field.FieldName, s.UpdateClear, field.Value))
  79. }
  80. if !field.CanUpdateClear {
  81. t.Fatalf("%+v\n", errors.Errorf("updateClear解析错误"))
  82. }
  83. case "Aes":
  84. if field.ColumnName != "aes" {
  85. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  86. field.FieldName, field.ColumnName))
  87. }
  88. encrypted, err := encoding.AESEncrypt(s.Aes, "@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L")
  89. if err != nil {
  90. t.Fatalf("%+v\n", errors.Errorf(err.Error()))
  91. }
  92. if encrypted != field.Value {
  93. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  94. field.FieldName, encrypted, field.Value))
  95. }
  96. case "JoinWith":
  97. if field.ColumnName != "join_with" {
  98. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  99. field.FieldName, field.ColumnName))
  100. }
  101. if strings.Join(s.JoinWith, "##") != field.Value {
  102. t.Fatalf("%+v\n", errors.Errorf("值不正确: fieldName: %v, fieldValue %v, tagValue %v",
  103. field.FieldName, strings.Join(s.JoinWith, "##"), field.Value))
  104. }
  105. case "Trim":
  106. if field.ColumnName != "trim" {
  107. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  108. field.FieldName, field.ColumnName))
  109. }
  110. if strings.Trim(s.Trim, "||") != field.Value {
  111. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  112. field.FieldName, strings.Trim(s.Trim, "||"), field.Value))
  113. }
  114. case "TrimPrefix":
  115. if field.ColumnName != "trim_prefix" {
  116. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  117. field.FieldName, field.ColumnName))
  118. }
  119. if strings.TrimPrefix(s.TrimPrefix, "{{") != field.Value {
  120. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  121. field.FieldName, strings.TrimPrefix(s.TrimPrefix, "{{"), field.Value))
  122. }
  123. case "TrimSuffix":
  124. if field.ColumnName != "trim_suffix" {
  125. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  126. field.FieldName, field.ColumnName))
  127. }
  128. if strings.TrimSuffix(s.TrimSuffix, "}}") != field.Value {
  129. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  130. field.FieldName, strings.TrimSuffix(s.TrimPrefix, "}}"), field.Value))
  131. }
  132. case "WrongAes":
  133. if field.ColumnName != "wrong_aes" {
  134. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  135. field.FieldName, field.ColumnName))
  136. }
  137. if s.WrongAes != field.Value {
  138. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  139. field.FieldName, s.WrongAes, field.Value))
  140. }
  141. case "WrongJoinWith":
  142. if field.ColumnName != "wrong_join_with" {
  143. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  144. field.FieldName, field.ColumnName))
  145. }
  146. if s.WrongJoinWith != field.Value {
  147. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  148. field.FieldName, s.WrongJoinWith, field.Value))
  149. }
  150. case "WrongTrim":
  151. if field.ColumnName != "wrong_trim" {
  152. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  153. field.FieldName, field.ColumnName))
  154. }
  155. if s.WrongTrim != field.Value {
  156. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  157. field.FieldName, s.WrongTrim, field.Value))
  158. }
  159. case "WrongTrimPrefix":
  160. if field.ColumnName != "wrong_trim_prefix" {
  161. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  162. field.FieldName, field.ColumnName))
  163. }
  164. if s.WrongTrimPrefix != field.Value {
  165. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  166. field.FieldName, s.WrongTrimPrefix, field.Value))
  167. }
  168. case "WrongTrimSuffix":
  169. if field.ColumnName != "wrong_trim_suffix" {
  170. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  171. field.FieldName, field.ColumnName))
  172. }
  173. if s.WrongTrimSuffix != field.Value {
  174. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  175. field.FieldName, s.WrongTrimPrefix, field.Value))
  176. }
  177. default:
  178. t.Fatalf("%+v\n", errors.Errorf("未知的字段名: tag fieldName: %v", field.FieldName))
  179. }
  180. }
  181. }
  182. type SqlMappingTagPointerFieldsStruct struct {
  183. Ignore *string `sqlmapping:"-"`
  184. Column *string `sqlmapping:"column:test_column"`
  185. Key *string `sqlmapping:"key"`
  186. NotUpdate *string `sqlmapping:"notUpdate"`
  187. UpdateClear *string `sqlmapping:"updateClear"`
  188. Aes *string `sqlmapping:"aes:@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L"`
  189. JoinWith *[]string `sqlmapping:"joinWith:##"`
  190. Trim *string `sqlmapping:"trim:||"`
  191. TrimPrefix *string `sqlmapping:"trimPrefix:{{"`
  192. TrimSuffix *string `sqlmapping:"trimSuffix:}}"`
  193. WrongAes *int `sqlmapping:"aes:@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L"`
  194. WrongJoinWith *string `sqlmapping:"joinWith:##"`
  195. WrongTrim *int `sqlmapping:"trim:||"`
  196. WrongTrimPrefix *int `sqlmapping:"trimPrefix:{{"`
  197. WrongTrimSuffix *int `sqlmapping:"trimSuffix:}}"`
  198. }
  199. func (s SqlMappingTagPointerFieldsStruct) checkFields(t *testing.T, fields []sql_mapping.Field) {
  200. for _, field := range fields {
  201. if field.FieldName == "Ignore" || field.ColumnName == "ignore" {
  202. t.Fatalf("%+v\n", errors.Errorf("忽略字段没有被忽略"))
  203. }
  204. switch field.FieldName {
  205. case "Column":
  206. if *s.Column != field.Value {
  207. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  208. field.FieldName, s.Column, field.Value))
  209. }
  210. if field.ColumnName != "test_column" {
  211. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  212. field.FieldName, field.ColumnName))
  213. }
  214. case "Key":
  215. if field.ColumnName != "key" {
  216. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  217. field.FieldName, field.ColumnName))
  218. }
  219. if *s.Key != field.Value {
  220. t.Fatalf("%+v\n", errors.Errorf("值不正确: fieldName: %v, fieldValue %v, tagValue %v",
  221. field.FieldName, s.Key, field.Value))
  222. }
  223. if !field.IsKey {
  224. t.Fatalf("%+v\n", errors.Errorf("key解析错误"))
  225. }
  226. case "NotUpdate":
  227. if field.ColumnName != "not_update" {
  228. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  229. field.FieldName, field.ColumnName))
  230. }
  231. if *s.NotUpdate != field.Value {
  232. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  233. field.FieldName, s.NotUpdate, field.Value))
  234. }
  235. if field.CanUpdate {
  236. t.Fatalf("%+v\n", errors.Errorf("notUpdate解析错误"))
  237. }
  238. case "UpdateClear":
  239. if field.ColumnName != "update_clear" {
  240. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  241. field.FieldName, field.ColumnName))
  242. }
  243. if *s.UpdateClear != field.Value {
  244. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  245. field.FieldName, s.UpdateClear, field.Value))
  246. }
  247. if !field.CanUpdateClear {
  248. t.Fatalf("%+v\n", errors.Errorf("updateClear解析错误"))
  249. }
  250. case "Aes":
  251. if field.ColumnName != "aes" {
  252. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  253. field.FieldName, field.ColumnName))
  254. }
  255. encrypted, err := encoding.AESEncrypt(*s.Aes, "@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L")
  256. if err != nil {
  257. t.Fatalf("%+v\n", errors.Errorf(err.Error()))
  258. }
  259. if encrypted != field.Value {
  260. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  261. field.FieldName, encrypted, field.Value))
  262. }
  263. case "JoinWith":
  264. if field.ColumnName != "join_with" {
  265. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  266. field.FieldName, field.ColumnName))
  267. }
  268. if strings.Join(*s.JoinWith, "##") != field.Value {
  269. t.Fatalf("%+v\n", errors.Errorf("值不正确: fieldName: %v, fieldValue %v, tagValue %v",
  270. field.FieldName, strings.Join(*s.JoinWith, "##"), field.Value))
  271. }
  272. case "Trim":
  273. if field.ColumnName != "trim" {
  274. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  275. field.FieldName, field.ColumnName))
  276. }
  277. if strings.Trim(*s.Trim, "||") != field.Value {
  278. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  279. field.FieldName, strings.Trim(*s.Trim, "||"), field.Value))
  280. }
  281. case "TrimPrefix":
  282. if field.ColumnName != "trim_prefix" {
  283. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  284. field.FieldName, field.ColumnName))
  285. }
  286. if strings.TrimPrefix(*s.TrimPrefix, "{{") != field.Value {
  287. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  288. field.FieldName, strings.TrimPrefix(*s.TrimPrefix, "{{"), field.Value))
  289. }
  290. case "TrimSuffix":
  291. if field.ColumnName != "trim_suffix" {
  292. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  293. field.FieldName, field.ColumnName))
  294. }
  295. if strings.TrimSuffix(*s.TrimSuffix, "}}") != field.Value {
  296. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  297. field.FieldName, strings.TrimSuffix(*s.TrimPrefix, "}}"), field.Value))
  298. }
  299. case "WrongAes":
  300. if field.ColumnName != "wrong_aes" {
  301. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  302. field.FieldName, field.ColumnName))
  303. }
  304. if *s.WrongAes != field.Value {
  305. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  306. field.FieldName, s.WrongAes, field.Value))
  307. }
  308. case "WrongJoinWith":
  309. if field.ColumnName != "wrong_join_with" {
  310. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  311. field.FieldName, field.ColumnName))
  312. }
  313. if *s.WrongJoinWith != field.Value {
  314. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  315. field.FieldName, s.WrongJoinWith, field.Value))
  316. }
  317. case "WrongTrim":
  318. if field.ColumnName != "wrong_trim" {
  319. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  320. field.FieldName, field.ColumnName))
  321. }
  322. if *s.WrongTrim != field.Value {
  323. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  324. field.FieldName, s.WrongTrim, field.Value))
  325. }
  326. case "WrongTrimPrefix":
  327. if field.ColumnName != "wrong_trim_prefix" {
  328. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  329. field.FieldName, field.ColumnName))
  330. }
  331. if *s.WrongTrimPrefix != field.Value {
  332. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  333. field.FieldName, s.WrongTrimPrefix, field.Value))
  334. }
  335. case "WrongTrimSuffix":
  336. if field.ColumnName != "wrong_trim_suffix" {
  337. t.Fatalf("%+v\n", errors.Errorf("列名解析测试错误: fieldName: %v, actual columnName: %v",
  338. field.FieldName, field.ColumnName))
  339. }
  340. if *s.WrongTrimSuffix != field.Value {
  341. t.Fatalf("%+v\n", errors.Errorf("值不正确:fieldName: %v, fieldValue %v, tagValue %v",
  342. field.FieldName, s.WrongTrimPrefix, field.Value))
  343. }
  344. default:
  345. t.Fatalf("%+v\n", errors.Errorf("未知的字段名: tag fieldName: %v", field.FieldName))
  346. }
  347. }
  348. }
  349. func TestSqlMappingTagDefaultUsage(t *testing.T) {
  350. ignore := strutils.SimpleUUID()
  351. column := strutils.SimpleUUID()
  352. key := strutils.SimpleUUID()
  353. notUpdate := strutils.SimpleUUID()
  354. updateClear := strutils.SimpleUUID()
  355. aes := strutils.SimpleUUID()
  356. joinWith := []string{strutils.SimpleUUID(), strutils.SimpleUUID()}
  357. trim := "||" + strutils.SimpleUUID() + "||"
  358. trimPrefix := "{{" + strutils.SimpleUUID()
  359. trimSuffix := strutils.SimpleUUID() + "}}"
  360. wrongAes := rand.Int()
  361. wrongJoinWith := strutils.SimpleUUID()
  362. wrongTrim := rand.Int()
  363. wrongTrimPrefix := rand.Int()
  364. wrongTrimSuffix := rand.Int()
  365. s := SqlMappingTagStruct{
  366. Ignore: ignore,
  367. Column: column,
  368. Key: key,
  369. NotUpdate: notUpdate,
  370. UpdateClear: updateClear,
  371. Aes: aes,
  372. JoinWith: joinWith,
  373. Trim: trim,
  374. TrimPrefix: trimPrefix,
  375. TrimSuffix: trimSuffix,
  376. WrongAes: wrongAes,
  377. WrongJoinWith: wrongJoinWith,
  378. WrongTrim: wrongTrim,
  379. WrongTrimPrefix: wrongTrimPrefix,
  380. WrongTrimSuffix: wrongTrimSuffix,
  381. }
  382. sPointerFields := SqlMappingTagPointerFieldsStruct{
  383. Ignore: &ignore,
  384. Column: &column,
  385. Key: &key,
  386. NotUpdate: &notUpdate,
  387. UpdateClear: &updateClear,
  388. Aes: &aes,
  389. JoinWith: &joinWith,
  390. Trim: &trim,
  391. TrimPrefix: &trimPrefix,
  392. TrimSuffix: &trimSuffix,
  393. WrongAes: &wrongAes,
  394. WrongJoinWith: &wrongJoinWith,
  395. WrongTrim: &wrongTrim,
  396. WrongTrimPrefix: &wrongTrimPrefix,
  397. WrongTrimSuffix: &wrongTrimSuffix,
  398. }
  399. sPointerFieldsNil := SqlMappingTagPointerFieldsStruct{}
  400. fields, err := sql_mapping.DefaultUsage(s)
  401. if err != nil {
  402. t.Fatalf("%+v\n", err)
  403. }
  404. s.checkFields(t, fields)
  405. fields, err = sql_mapping.DefaultUsage(&s)
  406. if err != nil {
  407. t.Fatalf("%+v\n", err)
  408. }
  409. s.checkFields(t, fields)
  410. fields, err = sql_mapping.DefaultUsage(sPointerFields)
  411. if err != nil {
  412. t.Fatalf("%+v\n", err)
  413. }
  414. sPointerFields.checkFields(t, fields)
  415. fields, err = sql_mapping.DefaultUsage(&sPointerFields)
  416. if err != nil {
  417. t.Fatalf("%+v\n", err)
  418. }
  419. sPointerFields.checkFields(t, fields)
  420. fields, err = sql_mapping.DefaultUsage(sPointerFieldsNil)
  421. if err == nil || err.Error() != "无法设置值,请检查是否传递的是非指针结构变量且字段为nil" {
  422. t.Fatalf("%+v\n", errors.Errorf("没有检测出from如果有nil字段,必须使用指针结构变量"))
  423. }
  424. fields, err = sql_mapping.DefaultUsage(&sPointerFieldsNil)
  425. if err != nil {
  426. t.Fatalf("%+v\n", err)
  427. }
  428. sPointerFieldsNil.checkFields(t, fields)
  429. }