MockBackend
Experimental Class
Обзор класса
class MockBackend implements ConnectionBackend {
constructor()
connections : any
connectionsArray : MockConnection[]
pendingConnections : any
verifyNoPendingRequests()
resolveAllConnections()
createConnection(req: Request) : MockConnection
}
Описание класса
Заглушка для бэкенда для тестирования сервиса Http.
Этот класс можно внедрить в тесты и использовать для переопределения поставщиков других бэкендов, таких как XHRBackend.
Пример
import {Injectable, ReflectiveInjector} from '@angular/core';
import {async, fakeAsync, tick} from '@angular/core/testing';
import {BaseRequestOptions, ConnectionBackend, Http, RequestOptions} from '@angular/http';
import {Response, ResponseOptions} from '@angular/http';
import {MockBackend, MockConnection} from '@angular/http/testing';
const HERO_ONE = 'HeroNrOne';
const HERO_TWO = 'WillBeAlwaysTheSecond';
@Injectable()
class HeroService {
constructor(private http: Http) {}
getHeroes(): Promise<String[]> {
return this.http.get('myservices.de/api/heroes')
.toPromise()
.then(response => response.json().data)
.catch(e => this.handleError(e));
}
private handleError(error: any): Promise<any> {
console.error('An error occurred', error);
return Promise.reject(error.message || error);
}
}
describe('MockBackend HeroService Example', () => {
beforeEach(() => {
this.injector = ReflectiveInjector.resolveAndCreate([
{provide: ConnectionBackend, useClass: MockBackend},
{provide: RequestOptions, useClass: BaseRequestOptions},
Http,
HeroService,
]);
this.heroService = this.injector.get(HeroService);
this.backend = this.injector.get(ConnectionBackend) as MockBackend;
this.backend.connections.subscribe((connection: any) => this.lastConnection = connection);
});
it('getHeroes() should query current service url', () => {
this.heroService.getHeroes();
expect(this.lastConnection).toBeDefined('no http service connection at all?');
expect(this.lastConnection.request.url).toMatch(/api\/heroes$/, 'url invalid');
});
it('getHeroes() should return some heroes', fakeAsync(() => {
let result: String[];
this.heroService.getHeroes().then((heroes: String[]) => result = heroes);
this.lastConnection.mockRespond(new Response(new ResponseOptions({
body: JSON.stringify({data: [HERO_ONE, HERO_TWO]}),
})));
tick();
expect(result.length).toEqual(2, 'should contain given amount of heroes');
expect(result[0]).toEqual(HERO_ONE, ' HERO_ONE should be the first hero');
expect(result[1]).toEqual(HERO_TWO, ' HERO_TWO should be the second hero');
}));
it('getHeroes() while server is down', fakeAsync(() => {
let result: String[];
let catchedError: any;
this.heroService.getHeroes()
.then((heroes: String[]) => result = heroes)
.catch((error: any) => catchedError = error);
this.lastConnection.mockRespond(new Response(new ResponseOptions({
status: 404,
statusText: 'URL not Found',
})));
tick();
expect(result).toBeUndefined();
expect(catchedError).toBeDefined();
}));
});
Этот метод существует только в реализации заглушки, а не в реальных бэкендах.
Аннотации
@Injectable()
Конструктор
constructor()
Подробности о классе
connections : any
EventEmitter экземпляров MockConnection, созданных этим бэкендом. Можно подписаться на него, чтобы реагировать на подключения.
import {ReflectiveInjector} from '@angular/core';
import {fakeAsync, tick} from '@angular/core/testing';
import {BaseRequestOptions, ConnectionBackend, Http, RequestOptions} from '@angular/http';
import {Response, ResponseOptions} from '@angular/http';
import {MockBackend, MockConnection} from '@angular/http/testing';
it('should get a response', fakeAsync(() => {
let connection:
MockConnection; // this will be set when a new connection is emitted from the
// backend.
let text: string; // this will be set from mock response
let injector = ReflectiveInjector.resolveAndCreate([
{provide: ConnectionBackend, useClass: MockBackend},
{provide: RequestOptions, useClass: BaseRequestOptions},
Http,
]);
let backend = injector.get(ConnectionBackend);
let http = injector.get(Http);
backend.connections.subscribe((c: MockConnection) => connection = c);
http.request('something.json').toPromise().then((res: any) => text = res.text());
connection.mockRespond(new Response(new ResponseOptions({body: 'Something'})));
tick();
expect(text).toBe('Something');
}));
Это свойство существует только в реализации заглушки, а не в реальных бэкендах.
connectionsArray : MockConnection[]
Массивная форма представления connections. Этот массив будет обновляться при каждом создании подключения этим бэкендом.
Это свойство существует только в реализации заглушки, а не в реальных бэкендах.
pendingConnections : any
EventEmitter экземпляров MockConnection, которые ещё не разрешены (т.е. с readyState меньше 4). Используется внутри для проверки отсутствия ожидающих подключений через метод verifyNoPendingRequests.
Это свойство существует только в реализации заглушки, а не в реальных бэкендах.
verifyNoPendingRequests()
Проверяет все подключения и вызывает исключение, если какое-либо подключение не получило ответ.
Этот метод существует только в реализации заглушки, а не в реальных бэкендах.
resolveAllConnections()
Может быть использован в сочетании с verifyNoPendingRequests для разрешения любых неразрешённых подключений, если ожидается, что некоторые подключения ещё не получили ответ.
Этот метод существует только в реализации заглушки, а не в реальных бэкендах.
createConnection(req: Request) : MockConnection
Создаёт новый MockConnection. Это эквивалентно вызову new
MockConnection(), за исключением того, что он также будет испускать новый Connection в эмиттер connections этого экземпляра MockBackend. Этот метод обычно используется только для тестов самого фреймворка, а не конечными пользователями.
экспортировано из @angular/http/testing/index, определено в @angular/http/testing/mock_backend.ts
© 2010–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://v2.angular.io/docs/ts/latest/api/http/testing/index/MockBackend-class.html