Karma+jasmine+Angular2 单元测试 http service error([object Objec



>我已经设置了一个简单的服务并尝试运行测试。

服务

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

执行 npm 运行测试导致错误:

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)

显然,缺少一些依赖项,但我无法理解它是什么。谁能解释一下去哪里看?乍一看 - 所有提供商都到位...

解决了:

//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: 'test@test.com',
                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('test@test.com');
                        expect(response[0].localtime).toBe('12:00');
                        expect(response[0].utcOffset).toBe(180);
                    }
                );
            }
        )
    )
)

});

最新更新