¿Hay alguna manera de crear una prueba unitaria de jazmín para un componente abstracto?
haciendo
const fixture = TestBed.createComponent(MyAbstractComponent);dice, "no se puede asignar un tipo de constructor abstracto a un tipo de constructor no abstracto"
Intenté algunas búsquedas pero no aparece nada.
Puede crear una clase simple en su archivo de prueba que se extienda desde la clase abstracta (no olvide simular métodos abstractos), en lugar de simplemente probar sus métodos no abstractos. Digamos que tenemos MyAbstractClass :
export abstract class MyAbstractClass { sum(a: number, b: number): number { return a + b; } abstract calc1(): void; abstract calc2(): void; }y luego en el archivo de especificaciones podemos simplemente crear una nueva clase derivada:
class MyClass extends MyAbstractClass { // just mock any abstract method calc1(): void { return; } calc2(): void { return; } }Entonces ahora podemos escribir pruebas para métodos no abstractos:
describe('MyAbstractClass', () => { let myClass: MyClass; beforeEach(() => { myClass = new MyClass(); }); it('sum two args', () => { const a = 1, b = 2; const sum = myClass.sum(a, b); expect(sum).toBe(3); }); });También creó un ejemplo de stackblitz de este ejemplo de prueba.
Esto es lo que hice para probar una tubería angular SafePipe que estaba usando una clase abstracta DomSanitizer .
// 1. Import the pipe/component to be tested import { SafePipe } from './safe.pipe'; // 2. Import the abstract class import { DomSanitizer } from '@angular/platform-browser'; // 3. Important step - create a mock class which extends // from the base class imported above and add implement // the mock methods class MockDomSanitizer extends DomSanitizer { sanitize(): string{ return 'ANY'; } bypassSecurityTrustHtml(): string{ return 'ANY' } bypassSecurityTrustStyle(): string{ return 'ANY' } bypassSecurityTrustScript(): string{ return 'ANY' } bypassSecurityTrustUrl(): string{ return 'ANY' } bypassSecurityTrustResourceUrl(): string{ return 'ANY' } } describe('SafePipe', () => { it('should return an HTML string', () => { // 4. create an instance of pipe class and inject the mocked class above let safePipe = new SafePipe(new MockDomSanitizer()); // 5. Add your asserions as ususal expect(safePipe.transform(null, 'html')).toBeTruthy(); expect(safePipe.transform(null, 'style')).toBeTruthy(); expect(safePipe.transform(null, 'script')).toBeTruthy(); expect(safePipe.transform(null, 'url')).toBeTruthy(); expect(safePipe.transform(null, 'resourceUrl')).toBeTruthy(); expect(safePipe.transform(null, 'anything')).toContain('anything'); }); });