簡體   English   中英

您如何將angular2服務注入到單元測試中? (RC3)

[英]How do you inject an angular2 service into a unit test? (RC3)

我正在使用RC3 我正在實現此處記錄的新Angular2路由器: https : Angular2

一切正常,但我在單元測試中遇到問題。 具體來說,我無法將Angular2服務注入我的單元測試中。

我相關的組件代碼是:

import {Component} from '@angular/core';
import {ActivatedRoute} from '@angular/router';

@Component({
  templateUrl: ...
  styleUrls: ...
})

export class Route1DetailComponent {

  constructor(private route:ActivatedRoute) {
    console.log(route);
  }
}

我的單元測試如下:

import {
  expect, it, iit, xit,
  describe, ddescribe, xdescribe,
  beforeEach, beforeEachProviders, withProviders,
  async, inject
} from '@angular/core/testing';

import {ActivatedRoute} from '@angular/router';
import {Route1DetailComponent} from './route1-detail.component';
import {TestComponentBuilder} from '@angular/compiler/testing';

describe('route1-detail.component.ts', () => {

  beforeEachProviders(() => [
    {provide: ActivatedRoute, useClass: ActivatedRoute}
  ]);

  it('should instantiate component',
    async(inject([TestComponentBuilder, ActivatedRoute], (tcb:TestComponentBuilder, ar: ActivatedRoute) => {
      tcb.createAsync(Route1DetailComponent).then((fixture) => {
        expect(fixture.componentInstance instanceof Route1DetailComponent).toBe(true, 'should create Route1DetailComponent');
        console.log(ar);
    });
  })));

});

“應實例化組件”單元測試失敗。 錯誤是:

無法解析“ ActivatedRoute”的所有參數(?,?,?,?,?)。 確保所有參數都用Inject修飾或具有有效的類型注釋,並且'ActivatedRoute'用Injectable修飾。

我該如何工作?

當我不注入ActivatedRoute一切正常。

謝謝。

在進行單元測試時,有時某個服務會導致問題,只是因為它沒有在正常環境中使用。 您可以進行測試以查看是否已調用它,而無需在整個服務中運行單元測試。 通過創建一個模擬類來做到這一點。

describe('route1-detail.component.ts', () => {

class MockActivatedRoute {}

beforeEachProviders(() => [
    {provide: ActivatedRoute, useClass: MockActivatedRoute}
  ]);

it('should instantiate component',
  async(inject([TestComponentBuilder, ActivatedRoute], (tcb:TestComponentBuilder, ar: MockActivatedRoute) => {
  tcb.createAsync(Route1DetailComponent).then((fixture) => {
    expect(fixture.componentInstance instanceof Route1DetailComponent).toBe(true, 'should create Route1DetailComponent');
    console.log(ar);
  });
})));

注意這一部分: inject([TestComponentBuilder, ActivatedRoute], (tcb:TestComponentBuilder, ar: MockActivatedRoute 。當代碼正在尋找ActivatedRoute時,您將向其傳遞模擬服務。當然,如果您專門嘗試對ActivatedRoute本身進行單元測試,然后創建模擬服務將無法達到目的,如果嘗試從該服務調用方法,則可能必須向模擬類添加方法或變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM