単位

2017-02-20 9 views
0

ここでは、私のコードの一部です:単位

angular.module('mine',[]).factory('MyFactory', ['$http','$q', function 
    MyFactory($http,$q) { 
      return { 
       getData: function() {  
        var deferred = $q.defer(), 
        url = "http://...";   

       $http.jsonp(url) 
       .then(    
        function (response) { 
         deferred.resolve(response.data); 
        }, 
        function (error) { 
         return $q.reject('Error retrieving data'); 
        } 
       ); 

       return deferred.promise; 
      } 
     }; 
}]); 


function MyController(MyFactory) { 

    var self = this; 

    self.getData= function() { 
     MyFactory.getData().then(
      function(result) { 
       self.contacts = result; 
      }, 
      function(error) { 
       console.log('Error retrieving data: ', error); 
      } 
     ); 
    }; 

    self.getData(); 
} 

angular.module('mine').component('myComponent', {  
    templateUrl: '..', 
    controller: MyController 
    }); 

工場からのデータがコントローラに正しく行けば、私はユニットテストにしようとしています。私のユニットテストコードはジャスミンを使用しています:

describe('component',() => { 
    let $componentController,contactsList,ctrl,$q,$rootScope;  

    beforeEach(angular.mock.module('mine'));  


    beforeEach(inject((_$componentController_,_MyFactory_, _$q_, _$rootScope_) => { 
    $componentController = _$componentController_; 

    ctrl = $componentController('myComponent',null); 
    $q = _$q_; 
    contactsList = _MyFactory_; 
    $rootScope = _$rootScope_;  
    })); 


it('should ... ', function() {  
     spyOn(contactsList, "getData").and.returnValue(
      $q.when({ 
      message: 'awesome message' 
      })); 

    ctrl.getData(); 
    $rootScope.$apply(); 
    expect(ctrl.contacts.message).toBe('awesome message'); 
    }); 
}); 

何らかの理由で、上記のテストが実行されていません。私は次のエラーを受け取ります:Possibly unhandled rejection: Error retrieving data thrown。理由は何ですか?なにが問題ですか?

答えて

0

テストでは、MyFactory$componentControllerを第2引数として入力する必要があります。だからではなく、この:

ctrl = $componentController('myComponent', { 
      MyFactory: _MyFactory_ 
     }); 
0

angular.module('mine', []).factory('MyFactory', ['$http', '$q', function 
 
    MyFactory($http, $q) { 
 
    return { 
 
     getData: function() { 
 
     var deferred = $q.defer(), 
 
      url = "http://google.com"; 
 

 
     $http.jsonp(url) 
 
      .then(
 
      function(response) { 
 
       deferred.resolve(response.data); 
 
      }, 
 
      function(error) { 
 
       return $q.reject('Error retrieving data'); 
 
      } 
 
     ); 
 

 
     return deferred.promise; 
 
     } 
 
    }; 
 
    } 
 
]); 
 

 
function MyController(MyFactory) { 
 
    this.getData = function() { 
 
    MyFactory.getData().then(
 
     function(result) { 
 
     this.contacts = result; 
 
     }.bind(this), 
 
     function(error) { 
 
     console.log('Error retrieving data: ', error); 
 
     } 
 
    ); 
 
    }; 
 

 
    this.getData(); 
 
} 
 

 
angular.module('mine').component('myComponent', { 
 
    controller: MyController 
 
}); 
 

 
describe('component',() => { 
 
    let $componentController, contactsList, $q, $rootScope, ctrlFactory; 
 

 
    beforeEach(angular.mock.module('mine')); 
 

 

 
    beforeEach(inject((_$componentController_, _MyFactory_, _$q_, _$rootScope_) => { 
 
    $componentController = _$componentController_; 
 
    ctrlFactory =() => { 
 
     return $componentController('myComponent', null, { 
 
     MyFactory: _MyFactory_ 
 
     }); 
 
    } 
 
    $q = _$q_; 
 
    contactsList = _MyFactory_; 
 
    $rootScope = _$rootScope_; 
 
    })); 
 

 
    it('should ... ', function() { 
 
    const message = 'awesome message' 
 
    spyOn(contactsList, "getData").and.returnValue(
 
     $q.when({ 
 
     message 
 
     })); 
 
    const ctrl = ctrlFactory() 
 
    ctrl.getData(); 
 
    $rootScope.$apply(); 
 
    expect(ctrl.contacts.message).toBe(message); 
 
    }); 
 
});
<link href="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" /> 
 
<script src="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.11/angular.min.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.11/angular-mocks.js"></script>

ctrl = $componentController('myComponent',null); 

これを使用します