2016-11-22 1 views
1

Я просто пытаюсь написать простой жасмин спецификацию для основного угловых 2 компонента, и я получаю эту ошибку:Нет кормильца ошибку маршрутизатора в Жасмине не спекуляция

zone.js:388 Unhandled Promise rejection: No provider for Router! ; Zone: ProxyZone ; Task: Promise.then ; Value:

Как это исправить?

Мой тест жасмин:

import 'zone.js/dist/long-stack-trace-zone.js'; 
import 'zone.js/dist/async-test.js'; 
import 'zone.js/dist/fake-async-test.js'; 
import 'zone.js/dist/sync-test.js'; 
import 'zone.js/dist/proxy.js'; 
import 'zone.js/dist/jasmine-patch.js'; 

import { ComponentFixture, TestBed } from '@angular/core/testing'; 
import { 
    BrowserDynamicTestingModule, 
    platformBrowserDynamicTesting 
} from '@angular/platform-browser-dynamic/testing'; 
import { By } from '@angular/platform-browser'; 
import { DebugElement } from '@angular/core'; 

import { MiddleRowComponent } from './middle-row.component'; 
import { CirclesComponent } from './circles.component'; 
import { ButtonComponent } from '../../shared/subcomponents/button.component'; 
import { Router } from '@angular/router'; 

let comp: MiddleRowComponent; 
let fixture: ComponentFixture<MiddleRowComponent>; 
let de: DebugElement; 
let el: HTMLElement; 

describe('MiddleRowComponent',() => { 
    var fixture: any; 
    var comp: any; 
    beforeAll(() => { 
     TestBed.resetTestEnvironment(); 
     TestBed.initTestEnvironment(BrowserDynamicTestingModule, 
      platformBrowserDynamicTesting()); 
    }); 

    beforeEach((done) => { 
     TestBed.configureTestingModule({ 
      declarations: [MiddleRowComponent, CirclesComponent, ButtonComponent], // declare the test component 
      providers: [Router] 
     }).compileComponents().then(() => { 
      fixture = TestBed.createComponent(MiddleRowComponent); 
      comp = fixture.componentInstance; // MiddleRowComponent test instance 
      // query for the title <h1> by CSS element selector 
      de = fixture.debugElement.query(By.css('h1')); 
      el = de.nativeElement; 
      done(); 
     }); 
    }); 

    it('should display original title',() => { 
     fixture.detectChanges(); 
     expect(el.textContent).toContain(comp.word); 
    }); 

    it('should display a different test title',() => { 
     comp.word = 'Test Title'; 
     fixture.detectChanges(); 
     expect(el.textContent).toContain('Test Title'); 
    }); 
}); 

Edit:

Я вижу свою спецификацию действительно использует маршрутизатор. Где добавить маршрутизатор в качестве поставщика?

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

@Component({ 
    selector: 'middle-row', 
    templateUrl: 'app/landing-page/subcomponents/middle-row.component.html', 
    styleUrls: ['app/landing-page/subcomponents/middle-row.component.css'] 
}) 
export class MiddleRowComponent { 
    public word: string = "stuff"; 
    private isGreen: boolean; 
    constructor(private router: Router) { }; 

    private tryNowClick(): void { 
     this.router.navigateByUrl('/find'); 
    }; 

    private onWordChanged(event: any): void { 
     this.isGreen = event.isGreen; 
     this.word = event.word; 
    } 
} 

ответ

3

Если вы на самом деле нужно использовать значения из маршрутизатор, который вы хотите сделать примерно так:

let mockRouter:any; 
    class MockRouter { 
     //noinspection TypeScriptUnresolvedFunction 
     navigate = jasmine.createSpy('navigate'); 
    } 





describe('Example Test',() => { 
     beforeEach(async(() => { 
        mockRouter = new MockRouter(); 
        TestBed.configureTestingModule({ 
         imports: [ AppModule ], 
         providers: [ { provide: Router, useValue: mockRouter }], 
        }) 
+0

Спасибо. Для чего нужен комментарий? Звучит как бросание ошибки, если не вызвано, что может быть полезно – BeniaminoBaggins

+1

Я получаю сообщение об ошибке в intellij, поэтому комментарий просто подавляет неразрешенные функции, которые бросает IDE. Возможно, вам не нужна эта строка – Bhetzie

2

Если маршрутизатор используется, то TestBed.configureTestingModule в beforeEach, должен содержать поле провайдеров, как это:

providers: [ { provide: Router, useClass: class { navigate = jasmine.createSpy("navigate"); } }] 

например:

beforeEach((done) => { 
     TestBed.configureTestingModule({ 
      declarations: [MiddleRowComponent, CirclesComponent, ButtonComponent], // declare the test component 
      providers: [ { provide: Router, useClass: class { navigate = jasmine.createSpy("navigate"); } }] 

     }).compileComponents().then(() => { 
      fixture = TestBed.createComponent(MiddleRowComponent);