2015-10-14 56 views
0

我正在嘗試使用TypeScript爲Angular Service編寫測試。我會誠實地說,我不知道我在做什麼,因爲這是我寫的第一個測試,所以任何幫助,將不勝感激。需要幫助爲Angular Service編寫Angular TypeScript Jasmine測試

我至今提供了以下錯誤: 類型錯誤:「未定義」不是(評估「this.httpAccessor.get(requestUrl)。然後」)

這裏是我試圖服務的對象測試:

/// <reference path="../../../typings/_references.ts" /> 

module app.service { 
    'use strict'; 

    export interface IAvailability { 
    getAvailability(requirements: app.Requirements): ng.IPromise<any>; 
    } 

    export class Availability implements IAvailability { 

    static $inject = ['$filter', 'Service.HttpResourceAccessor']; 

    /** 
    * Constructor. 
    */ 
    constructor(private $filter: ng.IFilterService, 
     private httpAccessor: app.service.IHttpResourceAccessor) { 
    } 

    /** 
    * Returns availability promise 
    */ 
    getAvailability(requirements: app.Requirements): ng.IPromise<any> { 

     /** 
     * Generate the request url using the requirements 
     */ 
     var requestUrl = this.generateRequestUrlFromRequirements(requirements); 

     return this.httpAccessor.get(requestUrl).then((response) => { 

     var availability: app.ITripAvailability<app.ITripAvailability>response; 
     return availability; 
     }); 
    } 

    /** 
    * Builds the request url using the requirements 
    */ 
    private generateRequestUrlFromRequirements(requirements: app.Requirements): string { 

     //The request string that will be returned after building 
     var requestUrl: string = ''; 
     var baseAddress = 'http://localhost:8080/'; 

     //Code emitted as this just builds a string and works fine 

     return requestUrl; 
    } 
    } 

    angular.module('app.service') 
    .service('Service.Availability', Availability); 
} 

這是迄今爲止測試:

/// <reference path="../../../../typings/_references.ts" /> 
/// <reference path="../../../../typings/angularjs/angular-mocks.d.ts" /> 
/// <reference path="../../../../typings/jasmine/jasmine.d.ts" /> 

module app.service { 

    describe("app.service.IAvailability",() => { 
    'use strict'; 

    var $filter: ng.IFilterService; 
    var mockAvailabilityService: app.service.Availability; 
    var mockHttpAccessor: app.service.IHttpResourceAccessor; 
    var requirements: app.Requirements; 

    beforeEach(() => { 
     angular.mock.module('app'); 
    }); 

    beforeEach(() => { 
     angular.mock.module('app.service'); 
    }); 

    /** 
    * Pre-test function before the test is executed 
    */ 
    beforeEach(() => { 

     requirements = new app.Requirements(); 

     angular.mock.inject((_$filter_: ng.IFilterService) => { 
     $filter = _$filter_; 

     mockHttpAccessor = <app.service.IHttpResourceAccessor>jasmine.createSpyObj(
      "httpAccessor", ["get"]); 

     mockAvailabilityService = new app.service.Availability(
      <ng.IFilterService>$filter, 
      <app.service.IHttpResourceAccessor>mockHttpAccessor); 
     }); 

    }); 

    it('Should call httpAccessor.get',() => { 
     mockAvailabilityService.getAvailability(tripRequirements); 
     expect(mockHttpAccessor.get).toHaveBeenCalled(); 
    }); 

    //How do I check if promise has been resolved? 
    }); 
} 

回答

1

你在正確的方向正朝着...

describe('app.service.IAvailability',()=>{ 
    // declare dependencies and common vars 
    var mockFilter: ng.IFilterService, 
    mockHttpAccessor: app.service.IHttpResourceAccessor, 
    requirements: app.Requirements, 
    availabilityService: app.service.Availability; 

    // setup dependencies/mocks 
    beforeEach(()=>{ 
    angular.mock.module('app'); 
    angular.mock.inject((_$filter_: ng.IFilterService) => { 
     mockFilter = _$filter_; 
    }); 
    mockHttpAccessor = <app.service.IHttpResourceAccessor>jasmine.createSpyObj("httpAccessor", ["get"]); 
    }); 

    // helper function to create instance of the service 
    // (useful if dependencies change, only 1 function needs changed) 
    function createService(){ 
    availabilityService = new app.service.Availability(
     mockFilter, 
     mockHttpAccessor); 
    } 

    // not a great test, but shows how to use the setup above 
    it('should contain a getAvailability method',() => { 
    createService(); 
    expect(availabilityService. getAvailability).toBeDefined(); 
    }); 
}); 
+0

謝謝。這樣可行。但是,我將如何調用實際方法並查看它是否有效?我編輯了這個問題以顯示我所嘗試的內容。 – AngularBoy

+0

在你調用'createService'之後,'availabilityService'就是你服務的一個實例,你可以調用它的任何方法,或者訪問它的任何其他屬性,具體取決於你正在測試的內容。 – Brocco

+0

我將如何調用並測試this.httpAccessor.get .....? – AngularBoy