Reputation: 123
I have set up a simple service and tried to run the test.
//CustomerServiceTest.ts:
import { Injectable, Pipe } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/Rx';
@Injectable()
export class CustomerServiceTest{
constructor(public http: Http) {}
query(URL: string, params?: Array<string>): Observable<any[]> {
let be_endpoint: string = 'http:\/\/localhost:44444\/';
let queryURL: string = `${be_endpoint}${URL}`;
if (params) {
queryURL = `${queryURL}?${params.join('&')}`;
}
return this.http.request(queryURL).map((res: any) => res.json());
}
searchBackEnd(query: string, type: string): Observable<any[]> {
return this.query(`/${type}`, [
`id=${query}`
]);
}
}
//CustomerServiceTest.spec.ts:
import {
TestBed,
getTestBed,
async,
inject
} from '@angular/core/testing';
import {
Headers, BaseRequestOptions,
Response, HttpModule, Http, XHRBackend, RequestMethod
} from '@angular/http';
import {ResponseOptions} from '@angular/http';
import {MockBackend, MockConnection} from '@angular/http/testing';
import { CustomerServiceTest } from '../../ts/components/CustomerServiceTest';
describe('CustomerServiceTest test suite', () => {
let mockBackend: MockBackend;
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
CustomerServiceTest,
MockBackend,
BaseRequestOptions,
{
provide: Http,
deps: [MockBackend, BaseRequestOptions],
useFactory:
(backend: XHRBackend, defaultOptions: BaseRequestOptions) => {
return new Http(backend, defaultOptions);
}
}
],
imports: [
HttpModule
]
}).compileComponents();
mockBackend = getTestBed().get(MockBackend);
}));
it('should get data', async(inject([CustomerServiceTest], (CustomerServiceTest) => {
let crmSvc:CustomerServiceTest;
let ContactResponceBody:Object = {
body: [
{
id: '12345678',
cellPhNum: '+9273839222',
lastName: 'TestUser',
firstName: 'TestUser'
}
]
};
let contactResponceOptions:ResponseOptions = new ResponseOptions(ContactResponceBody);
let contactResponse:Response = new Response(contactResponceOptions);
mockBackend.connections.subscribe(
(connection: MockConnection) => {
connection.mockRespond(contactResponse);
});
crmSvc = getTestBed().get(CustomerServiceTest);
expect(crmSvc).toBeDefined();
})));
});
Executing npm run test results in error:
Chrome 49.0.2623 (Windows 7 0.0.0) CustomerServiceTest test suite should get data FAILED
Failed: No provider for [object Object]!
Error: DI Error
at NoProviderError.Error (native)
at NoProviderError.ZoneAwareError (karma.entry.js:43703:33)
at NoProviderError.BaseError [as constructor] (karma.entry.js:6062:34)
at NoProviderError.AbstractProviderError [as constructor] (karma.entry.js:32848:16)
at new NoProviderError (karma.entry.js:32879:16)
at ReflectiveInjector_._throwOrNull (karma.entry.js:53504:19)
at ReflectiveInjector_._getByKeyDefault (karma.entry.js:53532:25)
at ReflectiveInjector_._getByKey (karma.entry.js:53495:25)
at ReflectiveInjector_.get (karma.entry.js:53304:21)
at TestBed.get (karma.entry.js:9842:67)
Apparently, some dependency is missing, but I can't understand what it is. Could anyone explain where to look? At first glance - all providers are at place...
Upvotes: 2
Views: 1232
Reputation: 123
Worked it out:
//CustomerService.spec.ts
import {
TestBed,
getTestBed,
async,
inject
} from '@angular/core/testing';
import {
Headers, BaseRequestOptions,
Response, HttpModule, Http, XHRBackend, RequestMethod
} from '@angular/http';
import {ResponseOptions} from '@angular/http';
import {MockBackend, MockConnection} from '@angular/http/testing';
import { CustomerServiceTest } from '../../ts/components/CustomerServiceTest';
describe('CustomerServiceTest:', () => {
let mockBackend: MockBackend;
let ContactResponceBody:Object = {
body: [
{
id: '1-DR8C2SJ',
cellPhNum: '1111',
lastName: 'qqq',
firstName: 'www',
midName: 'eee',
sex: 'М',
age: 23,
email: '[email protected]',
localtime: '12:00',
utcOffset:180
}
]
};
let contactResponceOptions:ResponseOptions = new ResponseOptions(ContactResponceBody);
let contactResponse:Response = new Response(contactResponceOptions);
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
CustomerServiceTest,
MockBackend,
BaseRequestOptions,
{
provide: Http,
deps: [MockBackend, BaseRequestOptions],
useFactory:
(backend: XHRBackend, defaultOptions: BaseRequestOptions) => {
return new Http(backend, defaultOptions);
}
}
],
imports: [
HttpModule
]
});
mockBackend = getTestBed().get(MockBackend);
}));
it('Available',
async(
inject(
[CustomerServiceTest],
(custSvc:CustomerServiceTest) => {
expect(custSvc).toBeDefined();
}
)
)
)
it('Returns data',
async(
inject(
[TCSCustomerServiceTest],
(custSvc:TCSCustomerServiceTest) => {
//emulate contact response from real back-end
mockBackend.connections.subscribe(
(connection: MockConnection) => {
connection.mockRespond(contactResponse);
});
custSvc.searchBackEnd('1-DR8C2SJ', 'contact').subscribe(
(response: any) => {
expect(response[0].id).toBe('1-DR8C2SJ');
expect(response[0].cellPhNum).toBe('1111');
expect(response[0].lastName).toBe('qqq');
expect(response[0].firstName).toBe('www');
expect(response[0].midName).toBe('eee');
expect(response[0].sex).toBe('М');
expect(response[0].age).toBe(23);
expect(response[0].email).toBe('[email protected]');
expect(response[0].localtime).toBe('12:00');
expect(response[0].utcOffset).toBe(180);
}
);
}
)
)
)
});
Upvotes: 2