2017-08-28 74 views
2

我正在學習Angular,我想做測試,但我卡住了。我有一個功能:你如何模擬ActivatedRoute

ngOnInit(): void { 
    this.route.paramMap 
    .switchMap((params: ParamMap) => 
     this.SomethingService.getSomething(params.get('id'))) 
     .subscribe(something => { 
      this.something = something; 
      this.doSomethingElse(); 
    }); 
} 

其中

route: ActivatedRoute 

,我要測試,但我不知道如何嘲笑ActivatedRoute

回答

2

一個簡單的方法來模擬ActivatedRoute是這個一個:

TestBed.configureTestingModule({ 
     declarations: [YourComponenToTest], 
     providers: [ 
     { 
      provide: ActivatedRoute, 
      useValue: { 
      params: Observable.from([{id: 1}]), 
      }, 
     }, 
     ] 
    }); 

然後在你的測試中它將可用和你的函數應該與此工作(至少Acti vatedRoute部分)

如果您想將其存儲在變量中,您可以在it函數中使用TestBed.get(ActivatedRoute)

不要忘了我正面臨着使用,而不是PARAMS paramMap同樣的問題,從rxjs/Rx,而不是導入可觀察到從rxjs/Observable

+0

這不起作用,因爲OP使用'paramMap'而不是'params'。 – Splaktar

2

。這引起了它的工作對我來說,至少在最簡單的情況:

import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/of'; 
import { ComponentToTest } from './component-to-test.component'; 
import { ActivatedRoute } from '@angular/router'; 

TestBed.configureTestingModule({ 
    declarations: [ComponentToTest], 
    providers: [ 
    { 
     provide: ActivatedRoute, 
     useValue: { 
      paramMap: Observable.of({ get: (key) => 'value' }) 
     } 
    } 
    ] 
}); 
0

任何有興趣如何正確地擁有多個物業這樣做,這是你定義你的模擬類的方式:

import { convertToParamMap } from '@angular/router'; 
import { Observable } from 'rxjs/Observable'; 

export class ActivatedRouteMock { 
    public paramMap = Observable.of(convertToParamMap({ 
     testId: 'abc123', 
     anotherId: 'd31e8b48-7309-4c83-9884-4142efdf7271',   
    })); 
} 

這樣你可以訂閱你的paramMap並檢索多個值 - 在這種情況下testIdanotherId