2014-03-18 27 views
0

我有這樣的控制器:使用在一個單元測試服務,角

angular.module('clientApp') 
    .controller('MainCtrl', function ($scope, projects) { 
    $scope.projects = projects; 
    }); 

項目是來自數據庫的決心。它在視圖中起作用。

這是我的服務:

angular.module('clientApp.services', ['ngResource']) 
    .factory('Projects', function($resource){ 
    return $resource('/api/project/:prj_id', {'prj_id':'@prj_id'}); 
    }) 
    .factory('MultiProjectsLoader',['Projects', '$q', '$stateParams', 
    function(Projects, $q) { 
     return function() { 
     var delay = $q.defer(); 
     Projects.query(function(projects) { 
      delay.resolve(projects); 
     }, function() { 
      delay.reject('Unable to fetch sizes'); 
     }); 
     return delay.promise; 
     }; 
    } 
    ]); 

這是我app.js

$stateProvider 
    .state('home', { 
    url: '/', 
    templateUrl: 'views/home.html', 
    resolve:{ 
     projects: ['MultiProjectsLoader', function(MultiProjectsLoader){ 
     return new MultiProjectsLoader(); 
     }] 
    }, 
    controller: 'MainCtrl' 
    }); 

嘗試寫這樣一個測試:

'使用嚴格的';

describe('Controller: MainCtrl', function() { 

    // load the controller's module 
    beforeEach(module('clientApp')); 

    beforeEach(function() { 
    angular.module('clientApp.services'); 
    }); 

    var MainCtrl, 
    scope; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function ($controller, $rootScope) { 
    scope = $rootScope.$new(); 
    MainCtrl = $controller('MainCtrl', { 
     $scope: scope 
    }); 

    })); 

    it('should attach a list of projects to the scope', function() { 
    expect(scope.projects.length).toBeGreaterThan(1); 
    }); 
}); 

我得到:

Error: [$injector:unpr] Unknown provider: projectsProvider <- projects 

我想我需要包括服務莫名其妙beforeEach(..)。但我無法得到它的工作。有任何想法嗎?

+0

凡'projects'被定義?你有沒有在測試中包含該文件?你在使用Karma嗎? – Fresheyeball

+0

項目在stateprovider中解析。是的,所有文件都被添加。是的,我正在使用業力。這個項目是從文員那裏拿來的。 – Per

回答

0

您可以通過幾種方式注入服務,但我推薦的方法是模擬服務。

describe('Controller: MainCtrl', function() { 
    var 
     projectServiceMock = { 
      getData: function() {} 
     }, 
     DATA_FROM_SERVER = {} 
    ; 

    // load the controller's module 
    beforeEach(module('clientApp')); 

    beforeEach(function() { 
    angular.module('clientApp.services'); 
    //angular.module('project'); // But dont use this method as you will be testing the  service in the controller: 
    }); 

    var MainCtrl, 
    scope; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function ($controller, $rootScope) { 
    scope = $rootScope.$new(); 
    spyOn(projectServiceMock, 'getData').andReturn(DATA_FROM_SERVER); 
    MainCtrl = $controller('MainCtrl', { 
     $scope: scope, 
     project: projectServiceMock 
    }); 

    })); 

    it('should attach a list of projects to the scope', function() { 
    expect(projectServiceMock.getData).toHaveBeenCalledWith(DATA_FROM_SERVER); 
    expect(scope.projects.length).toBeGreaterThan(1); 
    }); 
}); 

您的服務應該公開一種方法,用於返回從服務器獲取的數據,而不僅僅是直接通過項目獲取數據。

例如:

project.getData();