2017-03-11 12 views
0

に失敗した私は、オブジェクトの配列をretieves AngularJS以下の基本的な工場で作成していますジャスミンテストはAngularJS工場

angular. 
module('core.beer-retriever'). 
factory('Beer', ['$resource', 
    ($resource) => { 
    return $resource('https://www.xxxxxxxxx.com/v2/beers', {}, { 
     query: { 
     method: 'GET', 
     isArray: true 
     }, 
    }); 
    }, 
]); 

私はジャスミンと次のテストを作成しました:

describe('Beer Service', function() { 
    beforeEach(angular.mock.module('core.beer-retriever')); 

    beforeEach(inject(function($httpBackend) { 
     let beersRetrieved = { 
     results: [{ 
      "id": 192, 
      "name": "Punk IPA 2007 - 2010", 
     }] 
     }; 
     $httpBackend.whenGET('https://api.xxxxxxxxx.com/v2/beers') 
     .respond(beersRetrieved); 
    })); 

    it('is defined', inject(function(Beer) { 
     expect(Beer).toBeDefined(); 
    })); 

    it('returns a resource function', inject(function(Beer) { 
     const output = Beer; 
     expect(output).toEqual(jasmine.any(Function)); 
     expect(output.query({}.$promise)).toBeDefined(); 
    })); 

    it('returns beers', 
     inject(function(Beer) { 
     const output = Beer.query(); 
     expect(output.length).toEqual(1); 
     expect(output[0].id).toEqual(192); 
     httpBackend.flush(); 
     })); 
    }); 

最初2つのテストは成功ですが、3番目のテストは失敗します:

Expected 0 to equal 1. 
TypeError: Cannot read property 'id' of undefined 
      at Object.<anonymous> (app/core/beer-retriever/beer-retriever.spec.js:29:25) 
      at Object.invoke (app/bower_components/angular/angular.js:4862:19) 
      at Object.WorkFn (app/bower_components/angular-mocks/angular-mocks.js:3170:20) 

問題がどこでわからないのですかです。誰も同じような問題を抱えていますか?前もって感謝します!

+0

あなたは$ httpBackendをフラッシュされていません。 – estus

+0

どういう意味ですか? – Anto

+0

模擬応答を有効にするには$ httpBackend.flush()が必要です。 – estus

答えて

2

リソースプロミスオブジェクトに解決関数を追加する必要があります。以下に示すように、この作業plunker

output.$promise.then(function(data) { 
     console.log(data); 
     output = data[0].results; 
     }); 

とフルスペック チェックアウトに見えます:

it('returns beers', 
    inject(function(Beer, $httpBackend) { 
     var output = Beer.query(); 
     output.$promise.then(function(data) { 
     console.log(data); 
     output = data[0].results; 
     }); 
     $httpBackend.flush(); 
     console.log('a11: ' + JSON.stringify(output)); 
     expect(output.length).toEqual(1); 
     console.log(output[0].id); 
     expect(output[0].id).toEqual(192); 
    })); 
+0

助けてくれてありがとう! – Anto

関連する問題