2017-03-03 101 views
0

我是Angular 2和Karma + Jasmine單元測試的新手。我無法弄清楚爲了讓這個單元測試使用嘲諷的響應,我做了什麼語義錯誤。在控制檯中,當「expect(items [0] .itemId).toBe(2);」它表示項目[0] .itemId未定義。Angular 2 Observable Service Karma Jasmine單元測試不起作用

有人能幫助我或指出我在正確的方向嗎?如果您需要任何其他信息,請告訴我。謝謝!

item.ts

export class Item { 
    itemId: number; 
    itemName: string; 
    itemDescription: string; 
} 

item.service.ts

import { Injectable, Inject } from '@angular/core'; 
    import { Headers, Http } from '@angular/http'; 
    import { Observable } from 'rxjs/Rx'; 
    import { Item } from './item'; 
@Injectable() 
export class ItemService { 
    private headers = new Headers({'Content-Type': 'application/json'}); 

    constructor(
    private http: Http) 
    { 

    } 

    getItems(listOptions: Object): Observable<Item[]> { 
    return this.http.post('/listItems', listOptions, {headers:this.headers}) 
     .map(response => response.json() as Item[]) 
    } 
} 

item.service.spec.ts

import { TestBed, fakeAsync, inject, tick } from '@angular/core/testing'; 
import { MockBackend } from '@angular/http/testing'; 
import { Http, BaseRequestOptions, Response, ResponseOptions } from '@angular/http'; 
import { Observable } from 'rxjs/Rx'; 
import { ItemService } from './item.service'; 
import { Item } from './item'; 


describe('ItemService',() => { 
    let mockResponse, matchingItem, connection; 

    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
     ItemService, 
     MockBackend, 
     BaseRequestOptions, 
     { 
      provide: Http, 
      useFactory: (backend, defaultOptions) => new Http(backend, defaultOptions), 
      deps: [MockBackend, BaseRequestOptions] 
     }, 
     // { provide: XHRBackend, useClass: MockBackend }   
     ] 
    }); 

    const items = [ 
     { 
     "itemId":2, 
     "itemName":"test item1", 
     "itemDescription":"hello hello"   
     }, 
     { 
     "itemId":1, 
     "itemName":"name2124111121", 
     "itemDescription":"description212412112"   
     } 
    ]; 
    mockResponse = new Response(new ResponseOptions({body: {data: items}, status: 200})); 
    }); 

    describe('getItems',() => { 

    //Subscribing to the connection and storing it for later 
    it('should return all the items',inject([ItemService, MockBackend], (service: ItemService, backend: MockBackend) => { 

     backend.connections.subscribe(connection => { 
      connection.mockRespond(mockResponse); 
     }); 
     service.getItems({isActive: true, sortColumn: "lastModifiedDateUtc", sortOrder: "desc"}) 
     .subscribe((items: Item[]) => { 
      expect(items.length).toBe(2); 
     }); 
     })); 
    }); 
    }); 

Plunkr:https://plnkr.co/edit/m7In2eVh6oXu8VNYFf9l?p=preview (有一些錯誤與普朗克我也需要幫助,但主要文件在那裏)

+1

'response.json()'不是項目陣列,'response.json()。data'是。 – jonrsharpe

+0

@jonrsharpe謝謝!我收到一個錯誤,說'屬性'數據'不存在於類型'Item []'' – user3495469

+0

是的,因爲你使用了錯誤的類型作爲參數。 – jonrsharpe

回答

0

mockResponse主體與實際的響應主體不匹配,這就是我得到錯誤的原因。

mockResponse = new Response(new ResponseOptions({body: {data: items}, status: 200}));mockResponse = new Response(new ResponseOptions({body: items, status: 200}));

相關問題