it-swarm.com.de

Angular 2 Gerätetest Fehler: Alle Parameter für 'RequestOptions' können nicht aufgelöst werden

Ich möchte eine einfache Komponente testen, die einige Abhängigkeiten hat. Ich muss also unter anderem Anbieter anbieten.

/* tslint:disable:no-unused-variable */

import { By }           from '@angular/platform-browser';
import { DebugElement, provide } from '@angular/core';

import {
  beforeEach,
  beforeEachProviders,
  describe,
  expect,
  it,
  inject,
  fakeAsync,
  TestComponentBuilder
} from '@angular/core/testing';

import { AuthHttp, AuthConfig } from 'angular2-jwt';
import { Router, provideRouter } from '@angular/router';
import { Http, ConnectionBackend, RequestOptions, HTTP_PROVIDERS } from '@angular/http';
import { LogoutButtonComponent } from './logout-button.component';
import { UserService } from '../../services/index';

describe('Component: LogoutButtonComponent', () => {

  let component: LogoutButtonComponent;

  beforeEachProviders(() => [
    LogoutButtonComponent,
    Http,
    provide(AuthHttp, { useFactory: Http }),
    provide(AuthConfig, { useValue: new AuthConfig() }),
    ConnectionBackend,
    RequestOptions,
    UserService
  ]);

  beforeEach(inject([AuthHttp, UserService, LogoutButtonComponent],
    (comp: LogoutButtonComponent) => {
      component = comp;
    }));

  it('should inject UserService', () => {
    // My test here
  });

});

Obwohl ich die folgende Fehlermeldung bekomme:

Fehler: Alle Parameter für 'RequestOptions' (?) Können nicht aufgelöst werden. Stellen Sie sicher, dass alle Parameter mit Inject oder gültigen Typanmerkungen versehen sind und dass 'RequestOptions' mit Injectable versehen ist.

Fehlt mir etwas in der beforeEachProviders-Funktion?

Hinweis: Diese Frage bezieht sich nur auf die Unit-Prüfung von Angular 2 mit Jasmin. Ich bin nicht auf der Suche nach Infos bezüglich Bootstraping-App, da dies in meiner App bereits in Ordnung ist und es hier weitere verwandte Fragen gibt.

12
Vassilis Pits

Sie müssen HttpModule in Ihre TestBed-Konfiguration importieren.

import { HttpModule } from "@angular/http";

TestBed.configureTestingModule({
  imports: [
    HttpModule
  ]
});

Nach diesem Unit-Test sollte es funktionieren ????????

22
0x1ad2

RequestOptions ist kein injizierbares, Sie injizieren dies nicht in Klassen. Stattdessen instanziieren Sie bei Bedarf eine HTTP-Anforderung. So können Sie es aus der beforeEachProviders entfernen und eine in der beforeEach instanziieren, wenn Sie es tatsächlich in den Tests benötigen:

let options: RequestOptions;

beforeEach(inject([AuthHttp, UserService, LogoutButtonComponent],
    (comp: LogoutButtonComponent) => {
      component = comp;
      options = new RequestOptions({method: RequestMethod.Post});
}));
4
Sunil D.

Ich habe meinen Fehler behoben, indem ich HttpModule und Http aus @angular/http importierte: 

import {HttpModule, Http} from "@angular/http"; 
...

TestBed.configureTestingModule({
  imports: [HttpModule], // <!-- HTTP module
  providers: [HttpService, SourceService, Http] // <!-- HTTP
});
2
Touqeer Shafi

Es könnte besser sein, den Benutzerdienst zu verspotten, als dass Sie sich um die RequestOptions oder das HttpModule keine Gedanken machen müssen. Hier ist mein oben angeführter Ansatz:

import { RouterTestingModule } from '@angular/router/testing';
import { TestBed } from '@angular/core/testing';
import { LogoutButtonComponent } from './logout-button.component';
import { UserService } from '../../services/index';

describe('Component: LogoutButtonComponent', () => {

  let component: LogoutButtonComponent;
  let fixture: ComponentFixture<LogoutButtonComponent>;
  let mockUserService;

    beforeEach(() => {
        // Provide array of user service methods used in LogoutButtonComponent to the createSpyObj
        mockUserService = jasmine.createSpyObj(['exampleUserServiceMethod']);

        TestBed.configureTestingModule({
            declarations: [ LogoutButtonComponent ],
            providers: [
                { provide: UserService, useValue: mockUserService }
            ],
            // Only if your component uses routing
            imports: [
                RouterTestingModule
            ]
        });

        fixture = TestBed.createComponent(LogoutButtonComponent);
        component = fixture.componentInstance;

    })

  it('should inject UserService', () => {
    // My test here
  });

});
0
Vinorth