55 * - Chinese labels (保存/取消/编辑/提交) match the component's own button text.
66 * - `userEvent` is used for realistic interactions; `fireEvent` only where needed.
77 */
8- import { act , fireEvent , render , screen , within } from '@testing-library/react' ;
8+ import { act , render , screen } from '@testing-library/react' ;
99import userEvent from '@testing-library/user-event' ;
10- import React , { createRef } from 'react' ;
10+ import { createRef } from 'react' ;
1111import { describe , expect , it , vi } from 'vitest' ;
1212import EditableTable , { type EditableColumn , type EditableTableInstance } from '../index' ;
1313
@@ -31,22 +31,14 @@ const BASE_COLUMNS: EditableColumn<Person>[] = [
3131 title : '姓名' ,
3232 dataIndex : 'name' ,
3333 editRender : ( { value, onChange } ) => (
34- < input
35- aria-label = "name-input"
36- value = { String ( value ?? '' ) }
37- onChange = { ( e ) => onChange ( e . target . value ) }
38- />
34+ < input aria-label = "name-input" value = { String ( value ?? '' ) } onChange = { ( e ) => onChange ( e . target . value ) } />
3935 ) ,
4036 } ,
4137 {
4238 title : '年龄' ,
4339 dataIndex : 'age' ,
4440 editRender : ( { value, onChange } ) => (
45- < input
46- aria-label = "age-input"
47- value = { String ( value ?? '' ) }
48- onChange = { ( e ) => onChange ( e . target . value ) }
49- />
41+ < input aria-label = "age-input" value = { String ( value ?? '' ) } onChange = { ( e ) => onChange ( e . target . value ) } />
5042 ) ,
5143 } ,
5244] ;
@@ -228,15 +220,8 @@ describe('validation', () => {
228220 title : '姓名' ,
229221 dataIndex : 'name' ,
230222 rules : [ { required : true , message : '姓名为必填项' } ] ,
231- editRender : ( { value, onChange, error } ) => (
232- < div >
233- < input
234- aria-label = "name-input"
235- value = { String ( value ?? '' ) }
236- onChange = { ( e ) => onChange ( e . target . value ) }
237- />
238- { error && < span role = "alert" > { error } </ span > }
239- </ div >
223+ editRender : ( { value, onChange } ) => (
224+ < input aria-label = "name-input" value = { String ( value ?? '' ) } onChange = { ( e ) => onChange ( e . target . value ) } />
240225 ) ,
241226 } ,
242227 ] ;
@@ -254,8 +239,7 @@ describe('validation', () => {
254239
255240 await userEvent . click ( screen . getByRole ( 'button' , { name : '提交' } ) ) ;
256241
257- expect ( await screen . findAllByRole ( 'alert' ) ) . not . toHaveLength ( 0 ) ;
258- expect ( screen . getByText ( '姓名为必填项' ) ) . toBeInTheDocument ( ) ;
242+ expect ( await screen . findByText ( '姓名为必填项' ) ) . toBeInTheDocument ( ) ;
259243 } ) ;
260244
261245 it ( 'shows validation error on change when validateTrigger is change' , async ( ) => {
@@ -302,17 +286,11 @@ describe('ref methods', () => {
302286 it ( 'addRow appends a new row' , async ( ) => {
303287 const ref = createRef < EditableTableInstance < Person > > ( ) ;
304288 render (
305- < EditableTable < Person >
306- ref = { ref }
307- rowKey = "id"
308- columns = { BASE_COLUMNS }
309- dataSource = { DATA }
310- editableMode = "all"
311- /> ,
289+ < EditableTable < Person > ref = { ref } rowKey = "id" columns = { BASE_COLUMNS } dataSource = { DATA } editableMode = "all" /> ,
312290 ) ;
313291
314292 act ( ( ) => {
315- ref . current ! . addRow ( { id : '99' , name : '新行' , age : 0 } ) ;
293+ ref . current ? .addRow ( { id : '99' , name : '新行' , age : 0 } ) ;
316294 } ) ;
317295
318296 const nameInputs = screen . getAllByLabelText ( 'name-input' ) ;
@@ -322,17 +300,11 @@ describe('ref methods', () => {
322300 it ( 'removeRow removes the correct row' , async ( ) => {
323301 const ref = createRef < EditableTableInstance < Person > > ( ) ;
324302 render (
325- < EditableTable < Person >
326- ref = { ref }
327- rowKey = "id"
328- columns = { BASE_COLUMNS }
329- dataSource = { DATA }
330- editableMode = "all"
331- /> ,
303+ < EditableTable < Person > ref = { ref } rowKey = "id" columns = { BASE_COLUMNS } dataSource = { DATA } editableMode = "all" /> ,
332304 ) ;
333305
334306 act ( ( ) => {
335- ref . current ! . removeRow ( 0 ) ;
307+ ref . current ? .removeRow ( 0 ) ;
336308 } ) ;
337309
338310 const nameInputs = screen . getAllByLabelText ( 'name-input' ) as HTMLInputElement [ ] ;
@@ -344,15 +316,9 @@ describe('ref methods', () => {
344316 it ( 'getData returns the current data' , ( ) => {
345317 const ref = createRef < EditableTableInstance < Person > > ( ) ;
346318 render (
347- < EditableTable < Person >
348- ref = { ref }
349- rowKey = "id"
350- columns = { BASE_COLUMNS }
351- dataSource = { DATA }
352- editableMode = "all"
353- /> ,
319+ < EditableTable < Person > ref = { ref } rowKey = "id" columns = { BASE_COLUMNS } dataSource = { DATA } editableMode = "all" /> ,
354320 ) ;
355321
356- expect ( ref . current ! . getData ( ) ) . toEqual ( DATA ) ;
322+ expect ( ref . current ? .getData ( ) ) . toEqual ( DATA ) ;
357323 } ) ;
358324} ) ;
0 commit comments