Angular 單元測試實踐 (5)

在 Angular 應(yīng)用中那伐,路由對整個應(yīng)用的用戶體驗踏施,起著非常重要的作用。因此罕邀,對路由進行單元測試读规,可以確保應(yīng)用的正確和高效運行。

路由的單元測試工作燃少,主要包括以下三個方面:

  • 測試導(dǎo)航地址是否正確
  • 測試路由參數(shù)是否正確
  • 測試加載組件是否正確

測試導(dǎo)航地址

在 Angular 應(yīng)用中束亏,通過在 a 元素上添加 routerLink 指令,實現(xiàn)路由功能阵具。

在測試前碍遍,我們需要建立一個指令的 stub定铜,避免做大量的工作去建立完整的 routerLink.

import { Directive, Input } from "@angular/core”;

@Directive({
  selector: '[routerLink]’
})
export class RouterLinkDirectiveStub {
  @Input('routerLink') linkParams: any;
}

在這里,selector 必須匹配 routerLink 指令怕敬,才能正常工作揣炕。我們會使用 routerLink 綁定,實現(xiàn)真實的 routerLink 指令的行為东跪。這樣畸陡,routerLink 指令的 linkParams 屬性會把導(dǎo)航地址傳遞給 stub.

現(xiàn)在可以編寫測試:

  it('should set up routerLink directives', () => {
    const linkDe = fixture.debugElement.queryAll(By.directive(RouterLinkDirectiveStub));
    const links = linkDe.map(de => de.injector.get(RouterLinkDirectiveStub));
    expect(links.length).toBe(2);
    expect(links[0].linkParams).toEqual('home’);
    expect(links[1].linkParams).toEqual(['heroes', 1]);
  });

  it('should get the id parameter', () => {
    expect(component.heroId).toBe(1);
  });

在測試用例中,我們使用 By 工具類的 directive 方法虽填,指定查詢元件的類型:組件或指令丁恭。 debugElement 屬性的 queryAll 方法,返回了所有查詢到的 routerLink 指令斋日。然后牲览,就可以對指令的數(shù)量,鏈接參數(shù)進行測試恶守。

測試路由參數(shù)

  1. 調(diào)整提供導(dǎo)航的組件:
@Component({
  selector: 'app-menu’,
  templateUrl: './menu.component.html’,
  styleUrls: ['./menu.component.css’]
})
export class MenuComponent implements OnInit {

  bookId: number;

  constructor(private route: ActivatedRoute) { }

  ngOnInit(): void {
    this.route.paramMap.subscribe(params => this.bookId = + params.get('id’));
  }

}

在初始化函數(shù)中第献,對 paramMap 方法進行訂閱,獲得參數(shù) id 對值兔港。

  1. 創(chuàng)建一個 stub庸毫,模擬 paramMap 方法的行為:
export class ActivatedRouteStub {

  private subject = new ReplaySubject<ParamMap>();

  constructor(initialParams?: Params) {
    this.setParamMap(initialParams);
  }

  readonly paramMap = this.subject.asObservable();

  setParamMap(params?: Params) {
    this.subject.next(convertToParamMap(params));
  }
}

在這里,可以使用 constructor 構(gòu)造函數(shù)或 setParamMap 設(shè)置路由參數(shù)衫樊。

  1. 編寫單元測試:
…
  beforeEach(() => {
    const activatedRoute = new ActivatedRouteStub();
    activatedRoute.setParamMap({id: 1});

    TestBed.configureTestingModule({
      declarations: [
        MenuComponent,
        RouterLinkDirectiveStub,
        RouterOutletComponentStub
      ],
      providers: [
        { provide: ActivatedRoute, useValue: activatedRoute }
      ],
    })
    .compileComponents();
  });
...    
  it('should get the id parameter', () => {
    expect(component.bookId).toBe(1);
  });

首先飒赃,在測試初始化階段,創(chuàng)建了 ActivatedRouteStub 類的一個實例橡伞,并設(shè)置參數(shù) id 的值為 1. 然后盒揉,在配置測試模塊時,把 activatedRoute 作為提供者進行添加兑徘。最后刚盈,我們驗證組件的屬性是否正確接收了來自路由參數(shù)的值。

測試加載組件

Angular 為我們提供了一個測試真實路由功能的類 RouterTestingModule挂脑,可以定義我們在測試時需要的路由:

TestBed.configureTestingModule({
  imports: [
    RouterTestingModule.withRoutes([{
      path: 'heroes/:id’,
      component: MenuComponent
    }])
  ],
  declarations: [MenuComponent]
});

通過使用這個方法藕漱,不僅可以測試路由的導(dǎo)航地址和路由參數(shù),也可以測試是否正確加載組件崭闲。

為了測試加載組件肋联,需要創(chuàng)建一個組件的 stub,提供 router-outlet刁俭,作為組件加載的占位符橄仍。

@Component({
  selector: 'router-outlet’,
  template: ‘'
})
export class RouterOutletComponentStub { }

最后,在配置測試模塊的時候,可以為 schemas 屬性添加 NO_ERRORS_SCHEMA侮繁。這樣虑粥,就不必再去創(chuàng)建一個目標組件,Angular 會忽略任何在模板中不能識別的組件宪哩。

測試報表頁面

路由測試報表頁面
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娩贷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锁孟,更是在濱河造成了極大的恐慌彬祖,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件品抽,死亡現(xiàn)場離奇詭異储笑,居然都是意外死亡,警方通過查閱死者的電腦和手機桑包,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門南蓬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纺非,“玉大人哑了,你說我怎么就攤上這事∩沼保” “怎么了弱左?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長炕淮。 經(jīng)常有香客問我拆火,道長,這世上最難降的妖魔是什么涂圆? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任们镜,我火速辦了婚禮,結(jié)果婚禮上润歉,老公的妹妹穿的比我還像新娘模狭。我一直安慰自己,他們只是感情好踩衩,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布嚼鹉。 她就那樣靜靜地躺著,像睡著了一般驱富。 火紅的嫁衣襯著肌膚如雪锚赤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天褐鸥,我揣著相機與錄音线脚,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛浑侥,可吹牛的內(nèi)容都是我干的又憨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼锭吨,長吁一口氣:“原來是場噩夢啊……” “哼蠢莺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起零如,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤躏将,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后考蕾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祸憋,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年肖卧,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚯窥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡塞帐,死狀恐怖拦赠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葵姥,我是刑警寧澤荷鼠,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站榔幸,受9級特大地震影響允乐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜削咆,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一牍疏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拨齐,春花似錦鳞陨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至熟史,卻和暖如春馁害,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹂匹。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工碘菜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓忍啸,卻偏偏與公主長得像仰坦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子计雌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容