DEV Community

Victor Sandoval Valladolid
Victor Sandoval Valladolid

Posted on

Angular Testing Library - Casos de Uso

Verificar que redireccione a una URL

it('...', async () => { const spyRouter = jest.spyOn(Router.prototype, 'navigate') await setupComponent() ... expect(spyRouter).toHaveBeenCalledWith(['/stores']) }) 
Enter fullscreen mode Exit fullscreen mode

Emular datos adquiridos por la URL

Para poder simular un id como dato ingresado por url (Ej. www.my-web.com/users/edit/1).

Debemos utilizar la clase stub ActivatedRouteStub que fué creado para simular datos de entrada por URL. Esta clase se le puede pasar lo siguiente:

new ActivatedRouteStub({ initialParams: { id: '1', // Ej de URL: /user/edit/:id }, initialQueryParams: { page: '1' // Ej de URL: /user/list?page=1 } }) 
Enter fullscreen mode Exit fullscreen mode

Esta clase se puede poner al inicio del renderizado del componente setupComponent() o en la zona de test

// Opción 1: En el renderizado del componente async function setupComponent() { return await render(UsersUpsertComponent, { declarations: [...], imports: [...], providers: [ ... { provide: ActivatedRoute, useValue: new ActivatedRouteStub({ initialParams: { id: '1', }, }), }, ], }) } 
Enter fullscreen mode Exit fullscreen mode
// Opción 2: En la zona de test async function setupComponent(params: { id?: string; zoneId?: string } = {}) { const initialParams = { id: '3157', ...params, } return await render(DeliveryZoneUpsertComponent, { declarations: [...], imports: [...], providers: [ ... { provide: ActivatedRoute, useValue: new ActivatedRouteStub({ initialParams }), }, ], }) } it('...', () => { const initialParams = { id: '3157', zoneId: '445', } const { fixture } = await setupComponent(initialParams) ... actions ... ... assertions ... }) 
Enter fullscreen mode Exit fullscreen mode

Captura de un elemento y ejecutar un evento

Mat-Toogle

Capturar el input dentro del mat-toggle

const toggle = screen.getByTestId('productList_productDisplay0Enabled0_toggle-input') 
Enter fullscreen mode Exit fullscreen mode

Ejecutar el evento change con fireEvent()

// Debemos capturar el input que está dentro del 'mat-toggle' const toggle = screen.getByTestId('productList_productDisplay0Enabled0_toggle-input') fireEvent.change(toggle, { target: { checked: false }, }) 
Enter fullscreen mode Exit fullscreen mode

Ejecutar el evento click con userEvent()

const user = userEvent.setup() // Debemos capturar el 'mat-toggle' como tal. const toggleEnabled = screen.getByTestId('[ELEMENT_ID]') await user.click(toggleEnabled) expect(toggleEnabled).toHaveAttribute('ng-reflect-checked', 'false') 
Enter fullscreen mode Exit fullscreen mode

Mat-Select

Capturar el elemento

// Por su ID const select = screen.getByTestId('[ELEMENT_ID]') // Por su Rol const select = screen.getByRole('combobox', { name: /List/i }) 
Enter fullscreen mode Exit fullscreen mode

Ejecutar el evento select con userEvent()

const user = userEvent.setup() const { fixture } = await setupComponent() const select = screen.getByRole('combobox', { name: /List/i }) await user.click(select) await user.click(screen.getByText(/Minimarket/i)) ... assertions ... 
Enter fullscreen mode Exit fullscreen mode

Para este caso no se puede usar fireEvent() directamente ya que el mat-select no contiene un select nativo HTML

Mat-Input

Capturar el elemento

//Por su ID const input = screen.getByTestId('[ELEMENT_ID]') //Por su label const input = screen.getByLabelText(/Minimum order amount/i) 
Enter fullscreen mode Exit fullscreen mode

Ejecutar el evento input usando fireEvent()

const input = screen.getByTestId('products_searchValue_input') fireEvent.input(input, { target: { value: 'foo' } }) ... assertions ... 
Enter fullscreen mode Exit fullscreen mode

Ejecutar el evento type usando userEvent()

const user = userEvent.setup() const legalName = screen.getByTestId('[ELEMENT_ID]') user.type(legalName, 'Kirby') ... assertions ... 
Enter fullscreen mode Exit fullscreen mode

Mat-Button

Capturar el elemento

//Por su ID const button = screen.getByTestId('app_save_button') //Por su label del button const button = screen.getByText(/Save/i) 
Enter fullscreen mode Exit fullscreen mode

Emular retorno de datos en un Modal

Para este caso debemos usar el stub test/__stubs__/MatDialogStub que es un clase que emula el retorno de datos de un modal y se implementa llamando a la clase MatDialogStub en el archivo .spec donde se monta el componente a testear.

//component.spec.ts async function setupComponent() { return await render(ApiIntegrationComponent, { declarations: [], imports: [], providers: [ // Se implementa el Stub { provide: MatDialog, useValue: new MatDialogStub() }, ... ], schemas: [CUSTOM_ELEMENTS_SCHEMA], }) } describe('...', () => { it('Should create component correctly', async () => { const { fixture } = await setupComponent() ... }) }) 
Enter fullscreen mode Exit fullscreen mode

Por defecto la clase MatDialogStub() retorna true. Si queremos retornar otro valor, entonces sería de esta manera.

providers: [ { provide: MatDialog, useValue: new MatDialogStub({ name: 'Foo', age: 23 }) }, ... ], 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)