2017-10-23 3 views
0

http post serivceをテストします。しかし、次のエラーでテストが失敗します Objectの一種であることが予想されるオブジェクトですが、ステータスがResponse:URL:nullのnull nullでした。ステータスのレスポンス:null null:http post serviceをテストするときはnull erorr

URLをRequestOptionsに追加しようとしましたが、エラーが発生しました。何が私はあなたが物事を過度に複雑されていると思う私は

//テストファイル

import { async, ComponentFixture, TestBed, getTestBed, inject } from '@angular/core/testing'; 
import { MockBackend, MockConnection } from '@angular/http/testing'; 
import { HttpPostService } from './http-post.service'; 
import { 
    BaseRequestOptions, Http, XHRBackend, HttpModule, 
    Response, ResponseOptions, RequestMethod 
} from '@angular/http'; 
import { ICourseModel } from '../interface/course-model'; 

describe('HttpPostService',() => { 
    let mockBackend: MockBackend; 


    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
     HttpPostService, 
     MockBackend, 
     BaseRequestOptions, 
     { 
      provide: Http, 
      deps: [MockBackend, BaseRequestOptions], 
      useFactory: 
      (backend: XHRBackend, defaultOptions: BaseRequestOptions) => { 
      return new Http(backend, defaultOptions); 
      } 
     } 
     ], 
     imports: [ 
     HttpModule 
     ] 
    }); 
    mockBackend = getTestBed().get(MockBackend); 
    })); 

    it('should insert new courseList', 
    async(inject([HttpPostService], (service: HttpPostService) => { 
     mockBackend.connections.subscribe((connection: MockConnection) => { 
     expect(connection.request.method).toBe(RequestMethod.Post); 
     connection.mockRespond(new Response(new ResponseOptions({}))); 
     const contentType = connection.request.headers.get('Content-Type'); 
     expect(contentType).not.toBeNull(); 
     expect(contentType).toEqual('application/json'); 
     expect(connection.request.url).toBe('someurl/data.json'); 
     }); 
     const courseList: ICourseModel[] = [ 
     { 'course': 'Mobile Development' }, 
     { 'course': 'Web Development' }, 
     { 'course': 'IOS Development' }, 
     { 'course': 'Android Development' } 
     ]; 
     const result = service.storeData(courseList); 
     result.subscribe(
     (successResult) => { 
      expect(successResult).toBeDefined(); 
      expect(successResult).toEqual({}); 
     }); 
    }))); 
}); 

// HTTPのPOSTサービス

import { Injectable } from '@angular/core'; 
import { Http, Headers } from '@angular/http'; 
import { ICourseModel } from '../interface/course-model'; 
import { Observable } from 'rxjs/Observable'; 

// HTTP Post service to post the data to the server. Add Content-type in the header while posting a data 
@Injectable() 
export class HttpPostService { 

    constructor(private http: Http) { } 

    storeData(crs: ICourseModel[]) { 
    const headers = new Headers({'Content-Type': 'application/json'}); 
    headers.append('Accept', 'application/json'); 
    return this.http.post('someurl/data.json', crs, {headers: headers}).catch(
     (error: Response) => { 
     return Observable.throw(error); 
     } 
    ); 
    } 

} 

答えて

0

をそれを把握するように見えるカントの問題である可能性があります。 http.postが機能するかどうかはテストしないでください(チームはそれを行いました)。あなたのサービスがhttp.postを正しく呼び出すかどうかテストしてください。これはあなたのサービスのために十分でなければなりません:

describe('HttpPostService',() => { 
    let service: HttpPostService; 
    let http; 
    const testError = new Error('Test Error'); 
    const courseList: ICourseModel[] = [ 
    { 'course': 'Mobile Development' }, 
    { 'course': 'Web Development' }, 
    { 'course': 'IOS Development' }, 
    { 'course': 'Android Development' } 
    ]; 

    beforeEach(() => { 
    http = jasmine.createSpyObject('http', ['post']); 
    service = new HttpPostService(http); 
    }); 

    it('should work',() => { 
    service.storeData(courseList); 
    expect(http.post 
     .toHaveBeenCalledWith('someurl/data.json', courseList, jasmine.any(Object)); 
    }); 

    it('should throw',() => { 
    http.post.and.returnValue(Observable.throw(testError)); 
    // since you're not handling error in HttpPostService, 
    // you don't need to test catch(), 
    // but if there was a HttpPostService.errorHanlder test would be: 
    spyOn(service, 'errorHandler'); 
    service.storeData(courseList); 
    expect(service.errorHandler).toHaveBeenCalledWith(testError); 
    }); 
}); 

jasmine spiesについてもっと知ることができます。

+0

私はしたくないですが、これは私の割り当てですので、私はしなければなりません。私のコードで答えることができますか?あなたの助けをありがとう – SONGSTER

+0

私は公式のテストとそのセットアップを見てお勧めします:https://github.com/angular/angular/blob/master/packages/http/test/http_spec.ts – Sasxa

+0

と私は持っているもう1つのクエリ、テストでレスポンスの 'Content-type'を確認する方法 – SONGSTER

関連する問題