Reputation: 293
I have a service like :
login.service.ts
import { Injectable } from 'angular2/core';
import { Http, Response, Headers } from 'angular2/http';
import { Config } from '../common/config';
@Injectable()
export class LoginService {
constructor(public http: Http) { }
response: JSON;
...
getAuthenticate( username, password ) {
let headers = new Headers();
const REST_BASE_URL = Config.GET_REST_BASE_URL;
let query = '?userid=' + username + ' +&action=authenticate&password=' + password;
headers.set('Accept', 'application/json');
return this.http.get(REST_BASE_URL + query, {
headers: headers
}).map((res: Response) => res.json());
}
}
I need to write a test for e.g. getAutenticate() method. No idea how I should inject that Http (mock-up vs real rest service). Here is my starting point:
import { it, describe, expect, inject, beforeEachProviders} from 'angular2/testing';
import {Http} from 'angular2/http';
import { LoginService } from './login.service';
class MockLoginService extends LoginService {
// todo something
}
describe('login service', () => {
beforeEachProviders(() => [
provide(TestService, {useClass: MockLoginService}), Http
]);
// beforeEachProviders(() => [LoginService, Http]);
it('should find credentials', inject([LoginService], (myService:MockLoginService) => {
console.log('HERE ', myService.getAutenticate('user1', 'pass1'));
expect(true).toBe(true);
}));
});
What would be a good approach ?
Upvotes: 2
Views: 201
Reputation: 202346
In fact to test your LoginService
you need to mock its dependencies and not the service itself. In this case, you need to replace the XHRBackend
class by the MockBackend
one.
beforeEachProviders(() => {
return [
HTTP_PROVIDERS,
provide(XHRBackend, { useClass: MockBackend }),
HttpService
];
});
Then you can inject the XHRBackend
and subscribe on its connections
property to intercept requests and return your own responses.
Here is a sample with a service called HttpService
:
it('test HTTP service', inject([XHRBackend, HttpService, Injector], (mockBackend, httpService, injector) => {
mockBackend.connections.subscribe(
(connection: MockConnection) => {
connection.mockRespond(new Response(
new ResponseOptions({
body: ['some content']
})));
});
httpService.getMethod().subscribe(
items => {
expect(items).toEqual(['test']);
},
() => {
console.log('error');
});
}));
The HttpService
could be the following:
@Injectable()
export class HttpService {
constructor(private http:Http) {
}
getMethod() {
return this.http.get('/test').map(res => res.json());
}
}
Upvotes: 4