Angular 2 Unit test Ошибка: не удается разрешить все параметры для 'RequestOptions'

Я хочу протестировать простой компонент с некоторыми зависимостями. Поэтому среди других я должен предоставить некоторые провайдеры.

/* 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
  });

});

Хотя я получаю следующую ошибку:

Ошибка: не удается разрешить все параметры для "RequestOptions" (?). Убедитесь, что все параметры украшены Inject или имеют действительные аннотации типов и что "RequestOptions" украшен Injectable.

Мне не хватает чего-то из функции beforeEachProviders?

Примечание. Этот вопрос связан только с Unit Testing Angular 2 с жасмином. Я не ищу информацию, касающуюся загрузочного приложения, поскольку это уже нормально в моем приложении, и здесь есть другие связанные вопросы.

Ответ 1

Вам нужно импортировать HttpModule в конфигурацию TestBed.

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

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

После этого модульное тестирование должно работать 👌🏻

Ответ 2

RequestOptions не является инъекционным, вы не вводите его в классы. Вместо этого вы создаете экземпляр одного из них при необходимости, используя HTTP-запрос. Поэтому вы можете удалить его из beforeEachProviders и создать экземпляр в beforeEach, если он действительно понадобится в тестах:

let options: RequestOptions;

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

Ответ 3

Я исправил свою ошибку, импортировав HttpModule и Http из @angular/http:

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

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