2017-03-03 3 views
0

私はAngular 2とKarma + Jasmineユニットテストの初心者です。私はこの単体テストに模擬応答を使用させるために、私が意味論上の誤りをどのようにして作ったのか分かりません。コンソールで、 "expect(items [0] .itemId).toBe(2);" item [0] .itemIdは定義されていません。角2観測サービスカルマジャスミンユニットテストが動作しない

誰かが私を助けたり、正しい方向に向けることができますか?追加情報が必要な場合はお知らせください。ありがとう!

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 (多少の誤差はであり、 Plunkr私も助けが必要ですが、メインファイルはそこにあります)

+1

'response.json() '項目の配列ではない、' response.json()。data'があるべきです。 – jonrsharpe

+0

@jonrsharpeありがとう! 'Item ']'の上に' Property 'data'が存在しないというエラーが表示されます – user3495469

+0

引数に間違った型を使用したためです。 – jonrsharpe

答えて

0

mockResponseボディが実際のレスポンスボディと一致しなかったため、エラーが発生しました。

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

関連する問題