unit - test service angular 4
Componentes de prueba angulares de 2 unidades con routerLink (3)
Estoy tratando de probar mi componente con angular 2 final, pero recibo un error porque el componente usa la directiva
routerLink
.
Obtuve el siguiente error:
No se puede vincular a ''routerLink'' ya que no es una propiedad conocida de ''a''.
Este es el código relevante de la plantilla
ListComponent
<a
*ngFor="let item of data.list"
class="box"
routerLink="/settings/{{collectionName}}/edit/{{item._id}}">
Y aquí está mi prueba.
import { TestBed } from ''@angular/core/testing'';
import { ListComponent } from ''./list.component'';
import { defaultData, collectionName } from ''../../config'';
import { initialState } from ''../../reducers/reducer'';
const data = {
sort: initialState.sort,
list: [defaultData, defaultData],
};
describe(`${collectionName} ListComponent`, () => {
let fixture;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [
ListComponent,
],
}).compileComponents(); // compile template and css;
fixture = TestBed.createComponent(ListComponent);
fixture.componentInstance.data = data;
fixture.detectChanges();
});
it(''should render 2 items in list'', () => {
const el = fixture.debugElement.nativeElement;
expect(el.querySelectorAll(''.box'').length).toBe(3);
});
});
Miré varias respuestas a preguntas similares, pero no pude encontrar una solución que funcionó para mí.
Necesita configurar todo el enrutamiento.
Para las pruebas, en lugar de usar el
RouterModule
, puede usar el
RouterTestingModule
desde
@angular/router/testing
, donde puede configurar algunas rutas simuladas.
También deberá importar
CommonModule
desde
@angular/common
para su
*ngFor
.
A continuación se muestra una prueba de aprobación completa
import { Component } from ''@angular/core'';
import { Router } from ''@angular/router'';
import { By } from ''@angular/platform-browser'';
import { Location, CommonModule } from ''@angular/common'';
import { RouterTestingModule } from ''@angular/router/testing'';
import { TestBed, inject, async } from ''@angular/core/testing'';
@Component({
template: `
<a routerLink="/settings/{{collName}}/edit/{{item._id}}">link</a>
<router-outlet></router-outlet>
`
})
class TestComponent {
collName = ''testing'';
item = {
_id: 1
};
}
@Component({
template: ''''
})
class DummyComponent {
}
describe(''component: TestComponent'', function () {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
CommonModule,
RouterTestingModule.withRoutes([
{ path: ''settings/:collection/edit/:item'', component: DummyComponent }
])
],
declarations: [ TestComponent, DummyComponent ]
});
});
it(''should go to url'',
async(inject([Router, Location], (router: Router, location: Location) => {
let fixture = TestBed.createComponent(TestComponent);
fixture.detectChanges();
fixture.debugElement.query(By.css(''a'')).nativeElement.click();
fixture.whenStable().then(() => {
expect(location.path()).toEqual(''/settings/testing/edit/1'');
console.log(''after expect'');
});
})));
});
ACTUALIZAR
Otra opción, si solo desea probar que las rutas se representan correctamente, sin intentar navegar ...
Simplemente importa el
RouterTestingModule
sin configurar ninguna ruta
imports: [ RouterTestingModule ]
luego simplemente verifique que el enlace se muestre con la ruta URL correcta, p. ej.
let href = fixture.debugElement.query(By.css(''a'')).nativeElement
.getAttribute(''href'');
expect(href).toEqual(''/settings/testing/edit/1'');
Para escribir un caso de prueba para
routerLink
.
Puedes seguir los pasos a continuación.
-
Importe
RouterTestingModule
yRouterLinkWithHref
.import { RouterTestingModule } from ''@angular/router/testing''; import { RouterLinkWithHref } from ''@angular/router'';
-
Importe
RouterTestingModule
en su móduloTestBed.configureTestingModule({ imports: [ RouterTestingModule.withRoutes([])], declarations: [ TestingComponent ] })
-
En caso de prueba, encuentre la directiva
RouterLinkWithHref
tot test para la existencia del enlace.it(''should have a link to /'', () => { const debugElements = fixture.debugElement.queryAll(By.directive(RouterLinkWithHref)); const index = debugElements.findIndex(de => { return de.properties[''href''] === ''/''; }); expect(index).toBeGreaterThan(-1); });
Si no está probando cosas relacionadas con el enrutador, puede configurar la prueba para ignorar directivas desconocidas con ''NO_ERRORS_SCHEMA''
import { NO_ERRORS_SCHEMA } from ''@angular/core'';
TestBed.configureTestingModule({
declarations: [
ListComponent,
],
schemas: [ NO_ERRORS_SCHEMA ]
});