Testuję jednostkę, która jest używana do edycji obiektu. Obiekt ma unikat id
używany do pobierania określonego obiektu z tablicy obiektów hostowanych w usłudze. Specyfika id
jest uzyskiwana za pośrednictwem parametru przekazywanego za pośrednictwem routingu, w szczególności przez ActivatedRoute
klasę.
Konstruktor wygląda następująco:
constructor(private _router:Router, private _curRoute:ActivatedRoute, private _session:Session) {
}
ngOnInit() {
this._curRoute.params.subscribe(params => {
this.userId = params['id'];
this.userObj = this._session.allUsers.filter(user => user.id.toString() === this.userId.toString())[0];
Chcę uruchomić podstawowe testy jednostkowe tego składnika. Nie jestem jednak pewien, jak mogę wstrzyknąć id
parametr, a komponent potrzebuje tego parametru.
Swoją drogą: mam już makietę do Session
usługi, więc nie martw się.
Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'ng:///DynamicTestModule/HomeContentComponent.ngfactory.js'. at http://localhost:9876/_karma_webpack_/polyfills.bundle.js:2605
of
powinien być używany samodzielnie. Prawdopodobnie użyłbyś równieżRouterTestingModule
zamiast kodu tej odpowiedzi.Wymyśliłem, jak to zrobić!
Ponieważ
ActivatedRoute
jest to usługa, można ustanowić dla niej usługę pozorowaną. Nazwijmy to pozorowaną usługąMockActivatedRoute
. RozszerzymyActivatedRoute
wMockActivatedRoute
następujący sposób:Linia
super(null, ....)
inicjuje superklasę, która ma cztery obowiązkowe parametry. Jednak w tym przypadku nie potrzebujemy niczego z żadnego z tych parametrów, więc inicjalizujemy je donull
wartości. Potrzebujemy tylko wartości,params
która ma wartośćObservable<>
. Dlatego za pomocąthis.params
nadpisujemy wartość parametruparams
i inicjalizujemy go jakoObservable<>
parametr, na którym opiera się podmiot testowy.Następnie, tak jak każda inna usługa pozorowana, po prostu ją zainicjuj i zastąp dostawcę komponentu.
Powodzenia!
źródło
super
lubObservable
. Skąd się one biorą?super()
jest wbudowany.Observable
pochodzi zrxjs/Observable
lub tylko wrxjs
zależności od wersji. Dostałbyś to za pomocąimport {Observable} from 'rxjs'
.W kątowej 8+ jest RouterTestingModule, którego możesz użyć, aby uzyskać dostęp do ActivatedRoute lub Router komponentu. Możesz także przekazywać trasy do RouterTestingModule i tworzyć szpiegów dla żądanych metod tras.
Na przykład w moim komponencie mam:
W moim teście mam:
a później w sekcji „to”:
W podobny sposób myślę, że możesz bezpośrednio przetestować paramMap za pomocą metody spyOnProperty jaśminu, zwracając obserwowalne lub używając kulek rxjs. Może to zaoszczędzić trochę czasu, a także nie wymaga utrzymywania dodatkowej klasy próbnej. Mam nadzieję, że jest to przydatne i ma sens.
źródło
Oto jak przetestowałem to w najnowszym Angular 2.0 ...
oraz w sekcji Dostawcy
źródło
Po prostu dodaj makietę ActivatedRoute:
...
źródło
Dla niektórych osób pracujących na Angular> 5, jeśli Observable.of (); nie działa, mogą użyć samej funkcji () importując import {of} z 'rxjs';
źródło
Podczas tworzenia zestawów testów dla ścieżki routingu napotkałem ten sam problem, co:
W komponencie zainicjowałem przekazaną właściwość jako:
Podczas uruchamiania testów, jeśli nie przekażesz wartości właściwości w swojej makiecie ActivatedRoute „useValue”, podczas wykrywania zmian za pomocą metody „fixture.detectChanges ()” uzyskasz wartość niezdefiniowaną. Dzieje się tak, ponieważ pozorowane wartości dla ActivatedRoute nie zawierają właściwości params.property. Następnie pozorna wartość useValue musi mieć te parametry, aby urządzenie mogło zainicjować właściwość „this.właściwość” w komponencie. Możesz dodać go jako:
Możesz rozpocząć testowanie, na przykład:
Teraz powiedzmy, że chcesz przetestować inną wartość właściwości, a następnie możesz zaktualizować swoją próbną trasę ActivatedRoute jako:
Mam nadzieję że to pomoże!
źródło
Dodano dostawcę w klasie testowej jako:
źródło