javascript - Angular - Testování @Input s připojenou sadou
Mám komponentu, která bere argument jako druh direktivy k nastavení velikosti <div> ve své šabloně, jediný problém nyní je, že si nejsem jistý, jak to otestovat?
Komponentu jsem zavolal takto, kde small lze nahradit jinými předdefinovanými velikostmi, jako jsou medium/large atd:
<spinner small></spinner>
Pak to vezmu jako @Input(<size>) a provedu set, abych změnil proměnnou velikosti, která je pak předána do [ngStyle] pro změnu CSS velikosti zobrazené komponenty.
component.ts
size: number;
@Input('small') set small(value) {
this.size = !value ? 25 : this.size;
}
get getSize() {
const myStyle = {
width: this.size + 'px',
height: this.size + 'px'
};
return myStyle;
}
component.html
<div [ngStyle]="getSize"></div>
Úspěšně jsem otestoval funkci get getSize(), ale u funkce @Input(<val>) set jsem se trochu zasekl :-/
Odpověď č. 1
Abychom věděli, jaký test provést, zeptejte se sami sebe této otázky:
Co dělá moje [vlastnost/součást/služba/funkce/proměnná/...]?
V tomto případě mohou vaši nastavovači odpovědět s
Jako setter s dekorátorem
Inputbych měl nastavit hodnotu proměnnésize, pokud je má vlastní hodnota nedefinovaná. Pokud je má vlastní hodnota definovaná, měl bych se vrátit k výchozí hodnotě.
To znamená, že vaše testy setterů budou vypadat takto:
it('should set size variable with value undefined', () => {
component.size = 10;
component.small = '';
epxect(component.size).toEqual(25);
});
it('should not change size variable with value defined', () => {
component.size = 10;
component.small = 'ff';
epxect(component.size).toEqual(10);
});
Odpověď č. 2
Ukázka Stackblitz
Abyste mohli špehovat vlastnosti getter/setter, můžete použít jasmine spyOnProperty:
Takže ve vašem příkladu máme: obj -> component, propertyName -> ‚small‘, accessType -> ‚set‘ :
it('call small setter method', () => {
const small = spyOnProperty(component, 'small', 'set'); // just spyOn setter method of small
component.size = 10; // set initial value of size to 10
component.small = 'large'; // set small property which as expected - should call setted method
// we expect that `small` setter method will be called
// with 'large' argument, since we setted it before
expect(small).toHaveBeenCalledWith('large');
// we also expect, that the logic of your setter method works correctly: `this.size = !value ? 25 : this.size;`
// since we pass value, your `this.size` will not change
expect(component.size).toBe(10);
});
Upravit
Toto je další test v případě, kdy předáme settru argument prázdný řetězec:
it('call small setter method 2', () => {
const small = spyOnProperty(component, 'small', 'set').and.callThrough();
component.small = '';
expect(small).toHaveBeenCalledWith('');
expect(component.size).toBe(25);
});
Jak se očekávalo - setter small bude volán s '' prázdným řetězcem a vlastnost size bude 25 kvůli tomu: this.size=!value ? 25 : this.size;
