2016-11-09 5 views
1

私は、約束を返すサービスを呼び出すAngular1コントローラを持っています。コントローラにコントローラにメソッドを追加すると、mochaは次のエラーをスローします。.catch()メソッドを含むPromiseをテストするときのエラー

TypeError: undefined is not an object (evaluating 'DogService.getDogs(_this.userId) 
      .then(function(result){ 
       _this.myDogs = result; 
      }) 
      .catch') in app/scripts/controllers/main.js (line 20) 
    [email protected]/scripts/controllers/main.js:20:11 
    test/spec/controllers/main.js:33:20 
    [email protected]://localhost:8080/context.js:151:17 

コントローラ

angular.module('testProblemApp').controller('MainCtrl', ['DogService', function (DogService) { 
var _this = this; 
_this.myDogs = []; 
_this.userId = 1; 

_this.init = function(){ 
    DogService.getDogs(_this.userId) 
    .then(function(result){ 
     _this.myDogs = result; 
    }) 
    .catch(function(error){ 
     console.log(error); 
    }); 
}; 
}]); 

テスト

describe('initialze function', function() { 
it('should set the myDogs array to the value returned by the Service', function() { 
    spyOn(DogService, 'getDogs').and.callFake(function() { 
    return { 
     then: function (callback) { 
     return callback([{ id: 1, name: 'baxter' }]); 
     }, 
     catch: function(callback){ 
     return callback('Error'); 
     } 
    } 
    }); 
    MainCtrl.init(); 
    expect(MainCtrl.myDogs).toEqual([{ id: 1, name: 'baxter' }]); 
}); 
}); 

Iがテストに合格コントローラから.catch()を削除した場合。

答えて

1

ここでの問題は連鎖です。 thencatchメソッドを持つ約束オブジェクトを返すことが期待されます。 thengetDogsで、モックはundefinedを返します。

コミットメントやその他のコア機能を、最初から書かれたカスタムスタブでモックするのは、不便です。 $q約束は$q約束して試験することができる。経験則として

var dogsPromiseMock; 
... 
spyOn(DogService, 'getDogs').and.callFake(function() { 
    return dogsPromiseMock; 
}); 
... 
dogsPromiseMock = $q.resolve([{ id: 1, name: 'baxter' }]); 
MainCtrl.init(); 
$rootScope.$digest(); 
expect(MainCtrl.myDogs).toEqual(...); 
... 
dogsPromiseMock = $q.reject(); 
MainCtrl.init(); 
$rootScope.$digest(); 
expect(MainCtrl.myDogs).toEqual(...); 

、コントローラユニットだけではなく、模擬単一のメソッドをテストする際に完全なサービスを模擬することが好ましいです。

+0

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

+0

あなたは大歓迎です。 – estus

関連する問題