pengujian unit - menggunakan MockBackend untuk menguji fungsi yang kemudian memanggil .map
Saya sedang mencoba menulis unit test untuk layanan saya yang membuat permintaan Http.
Saya memiliki sebuah layanan yang mengembalikan permintaan Http.get() diikuti dengan .map(). Saya mengalami kesulitan agar backend tiruan saya mengembalikan sesuatu yang tidak menimbulkan kesalahan pada .map(). Kesalahan yang saya dapatkan adalah:
this._http.get(...).map is not a function
Saya telah menggunakan artikel ini sebagai panduan utama saya sepanjang waktu.
Jika saya menghapus .map() dari fungsi layanan saya, saya tidak mendapatkan kesalahan apa pun. Bagaimana saya bisa membuat respons tiruan saya memiliki fungsi .map() yang bisa saya panggil?
Catatan: Saya saat ini menggunakan RC.4
Berikut adalah layanan saya:
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { AppSettings } from '../../../settings';
import { Brand } from '../../models/index';
@Injectable()
export class BrandDataService {
allBrands : Brand[];
groups : any;
groupNames : string[];
constructor (
private _http : Http
) {}
/**
* Get all brands
*/
public getAllBrands () :Observable<any> {
let url = AppSettings.BRAND_API_URL + 'brands';
return this._http.get( url )
.map( this.createAndCacheBrands )
.catch( (error) => {
return Observable.throw( error );
});
}
private createAndCacheBrands (res:Response) {
...
}
}
Dan berikut adalah file spesifikasi saya, yang menggunakan MockBackend dan pustaka terkait lainnya untuk memalsukan backend untuk pengujian ini:
// vendor dependencies
import { Http, BaseRequestOptions, Response, ResponseOptions, RequestMethod } from '@angular/http';
import { addProviders, inject } from '@angular/core/testing';
import { MockBackend, MockConnection } from '@angular/http/testing';
// Service to test
import { BrandDataService } from './brandData.service';
describe( 'Brand data service', () => {
let service : BrandDataService = null;
let backend : MockBackend = null;
// Provide a mock backend implementation
beforeEach(() => {
addProviders([
MockBackend,
BaseRequestOptions,
{
provide : Http,
useFactory : (backendInstance : MockBackend, defaultOptions : BaseRequestOptions) => {
return new Http(backendInstance, defaultOptions);
},
deps : [MockBackend, BaseRequestOptions]
},
BrandDataService
])
})
beforeEach (inject([BrandDataService, MockBackend], (_service : BrandDataService, mockBackend : MockBackend) => {
service = _service;
backend = mockBackend;
}));
it ('should return all brands as an Observable<Response> when asked', (done) => {
// Set the mock backend to respond with the following options:
backend.connections.subscribe((connection : MockConnection) => {
// Make some expectations on the request
expect(connection.request.method).toEqual(RequestMethod.Get);
// Decide what to return
let options = new ResponseOptions({
body : JSON.stringify({
success : true
})
});
connection.mockRespond(new Response(options));
});
// Run the test.
service
.getAllBrands()
.subscribe(
(data) => {
expect(data).toBeDefined();
done();
}
)
});
});
Jawaban #1
Anda perlu mengimpor rxjs agar Anda dapat menggunakan map:
import 'rxjs/Rx';
Atau, Anda bisa mengimpor hanya operator map sehingga aplikasi Anda tidak memuat file yang tidak akan Anda gunakan:
import 'rxjs/add/operator/map';
