Testowanie serwisów

Testując składowe aplikacji Angularowej nie zawsze musimy opierać się na jego funkcjonalnościach. Jeśli w naszym teście:

  • nie importujemy bibliotek testowych Angulara
  • nie konfigurujemy modułu
  • nie dostarczamy zależności za pomocą atrybutu providers
  • nie wywołujemy inject, async oraz fakeAsync

to mamy do czynienia z tzw. Isolated Test, czyli testem izolowanym.

Testowany serwis

W naszej aplikacji posiadamy serwis do używany do pozyskania prefixu używanego w localStorage:

import { Injectable } from '@angular/core';

@Injectable()
export class LocalStoragePrefixService {

  private prefix: string;

  constructor () {
  }

  public get (): string {
    return this.prefix ? this.prefix : '';
  }

  public set (prefix: string) {
    this.prefix = prefix;
  }

  public clear () {
    this.prefix = '';
  }
}

Ponieważ jest to zwykła klasa a nie moduł Angulara możemy przetestować go w prosty sposób:

import { LocalStoragePrefixService } from './local-storage-prefix.service';

describe('LocalStoragePrefixService', () => {
  let service: LocalStoragePrefixService;

  beforeEach(() => {
    service = new LocalStoragePrefixService();
  });

  it('should return empty string as prefix after construction', () => {
    expect(service.get()).toBe('');
  });

  it('should set specified prefix', () => {
    service.set('SOME_CUSTOM_PREFIX');

    expect(service.get()).toBe('SOME_CUSTOM_PREFIX');
  });

  it('should clear prefix', () => {
    service.set('SOME_CUSTOM_PREFIX');
    service.clear();

    expect(service.get()).toBe('');
  });
});

Jeżeli testowany serwis w dowolnej z metod zwraca obiekt typu Observable lub Promise musimy test oznaczyć w Jasmine jako asynchroniczny. Przykład takich metod:

import { Observable } from 'rxjs/Observable';

import "rxjs/add/observable/of";

public getObservable (): Observable<string> {
  return Observable.of(this.get());
}

public getPromise (): Promise<string> {
  return new Promise((resolve) => {
    resolve(this.get());
  });
}

Przetestowanie tych metod wyglądać może następująco:

describe('async methods', () => {
  beforeEach(() => {
    service.set('SOME_CUSTOM_PREFIX');
  });

  it('#getObservable should return observable value', (done: DoneFn) => {
    service.getObservable().subscribe((prefix) => {
      expect(prefix).toBe('SOME_CUSTOM_PREFIX');

      done();
    });
  });

  it('#getPromise should return async value', (done: DoneFn) => {
    service.getPromise().then((prefix) => {
      expect(prefix).toBe('SOME_CUSTOM_PREFIX');

      done();
    });
  });
});

results matching ""

    No results matching ""