Ответ 1
Вам нужно импортировать HttpModule
в конфигурацию TestBed.
import { HttpModule } from "@angular/http";
TestBed.configureTestingModule({
imports: [
HttpModule
]
});
После этого модульное тестирование должно работать 👌🏻
Я хочу протестировать простой компонент с некоторыми зависимостями. Поэтому среди других я должен предоставить некоторые провайдеры.
/* 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 с жасмином. Я не ищу информацию, касающуюся загрузочного приложения, поскольку это уже нормально в моем приложении, и здесь есть другие связанные вопросы.
Вам нужно импортировать HttpModule
в конфигурацию TestBed.
import { HttpModule } from "@angular/http";
TestBed.configureTestingModule({
imports: [
HttpModule
]
});
После этого модульное тестирование должно работать 👌🏻
RequestOptions
не является инъекционным, вы не вводите его в классы. Вместо этого вы создаете экземпляр одного из них при необходимости, используя HTTP-запрос. Поэтому вы можете удалить его из beforeEachProviders
и создать экземпляр в beforeEach
, если он действительно понадобится в тестах:
let options: RequestOptions;
beforeEach(inject([AuthHttp, UserService, LogoutButtonComponent],
(comp: LogoutButtonComponent) => {
component = comp;
options = new RequestOptions({method: RequestMethod.Post});
}));
Я исправил свою ошибку, импортировав HttpModule
и Http
из @angular/http
:
import {HttpModule, Http} from "@angular/http";
...
TestBed.configureTestingModule({
imports: [HttpModule], // <!-- HTTP module
providers: [HttpService, SourceService, Http] // <!-- HTTP
});