Jn_Lch
Jn_Lch

Reputation: 123

Karma+jasmine+Angular2 unit testing http service error (No provider for [object Object])

I have set up a simple service and tried to run the test.

Service

//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}`
   ]);
 }

}

Test for the service

//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

Answers (1)

Jn_Lch
Jn_Lch

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

Related Questions