Bolzplatzarena

Mocken von Instanzen bei Unittests bei Typescript

Beim Schreiben von Unittests bei meinem Angular-Projekt, wurde ich schnell mit einem Problemen konfrontiert: Um Instanzen der Klasse zu erstellen, welche ich testen wollte, brauchte ich wiederum weitere Klassen. Die benötigten Provider, um die Klassen erzeugen zu lassen, sind natürlich im Test nicht enthalten. 

Da ein Unittest nicht dazu da ist, alles zu testen, sondern nur eine spezielle Klasse oder sogar nur Teile davon, macht es keinen Sinn, den Test dahin zu erweitern, dass er mit allen Abhängigkeiten umgehen kann. Daher sollten nicht zu testende aber gebrauchte Klassen gemockt werden. Somit wird "nur" eine scheinbare echte Instanz genutzt. Am besten eignet sich dabei ts-mockito.

Zunächst muss ts-mockito installiert werden.

Terminal

1
npm i ts-mockito

Danach kann man Mocks erstellen. Über die Providerdeklaration kann man dann per Factory eine Instanz zurückgeben.

Beispiel: Ich habe eine Login-Komponente, die einen OidcSecurityService benutzt. Ich möchte gern die Komponente testen, ohne von dem OidcSecurityService gebrauch zu machen, weil da noch viel mehr dran hängt.

unittest.spec.ts

TS
1 2 3 4 5 6 7 8 9 10 11 12 13
let component: LoginComponent;
let fixture: ComponentFixture<LoginComponent>;
let securityMock: OidcSecurityService;
beforeEach(async(() => {
  securityMock = mock(OidcSecurityService);
  TestBed.configureTestingModule({
    declarations: [LoginComponent],
    providers: [
      { provide: OidcSecurityService, useFactory: () => instance(securityMock) }
    ],
  })
  .compileComponents();
}));