2015-09-01 60 views
0

我需要大量的注射(服务,工厂,值)的测试控制器,现在我有一个价值的问题......注射问题angularjs

我有以下的情况:

这是我的控制器。

(function() { 
'use strict'; 
angular 
    .module('otpConfigureDatasets') 
    .controller('otpConfigureDatasetsController', otpConfigureDatasetsController); 

otpConfigureDatasetsController.$inject = ['$location', '$state', 'otpWebMapApp', 'otpWMDeltaTracker', 'otpWMStateCache', '$scope', '$timeout', 'otpConfigureDatasetService', 'otpAllDatasetsService', 'otpReviewListDatasetsService','otpConfigureDatasetSelectedTab']; 

function otpConfigureDatasetsController($location, $state, otpWebMapApp, otpWMDeltaTracker, otpWMStateCache, $scope, $timeout, otpConfigureDatasetService, otpAllDatasetsService, otpReviewListDatasetsService, otpConfigureDatasetSelectedTab) { 

    var vm = this; 
    ... 

    vm.tabs = [{ 
     title: 'MY REVIEW LIST', 
     selectedAmt: vm.reviewData, 
     contentTemplate: './app/features/configureDatasets/reviewListDatasets.html', 
     active: otpConfigureDatasetSelectedTab.tab == 'MyReviewList' 
    }, { 
     title: 'ALL DATASETS', 
     selectedAmt: vm.allData, 
     contentTemplate: './app/features/configureDatasets/allDatasets.html', 
     active: otpConfigureDatasetSelectedTab.tab == 'AllDatasets' 
    }]; 

    ... 
} 
})(); 

我Spec.js下面

'use strict'; 

describe('Test', function() { 

var MainCtrl, scope, _otpWebMapApp_, _otpWMDeltaTracker_, _otpWMStateCache_, _otpConfigureDatasetService_, 
    _otpAllDatasetsService_, _otpReviewListDatasetsService_, _otpConfigureDatasetSelectedTab_; 


beforeEach(function() { 
    module('otpConfigureDatasets'); 
}); 


beforeEach(inject(function ($controller, $rootScope) { 

    scope = $rootScope.$new(); 
    MainCtrl = $controller('otpConfigureDatasetsController', { 
     $scope: scope, otpWebMapApp: _otpWebMapApp_, otpWMDeltaTracker: _otpWMDeltaTracker_, otpWMStateCache: _otpWMStateCache_, 
     otpConfigureDatasetService: _otpConfigureDatasetService_, otpAllDatasetsService: _otpAllDatasetsService_, 
     otpReviewListDatasetsService: _otpReviewListDatasetsService_, otpConfigureDatasetSelectedTab: _otpConfigureDatasetSelectedTab_ 
    });  

})); 



it('Should be true', function() { 
    expect(true).toBe(true); 
}); 


}); 

但是当我尝试运行测试用例,它doesn't工作,并显示以下错误:

INFO [karma]: Karma v0.12.37 server started at http://localhost:9876/ 
INFO [launcher]: Starting browser PhantomJS 
INFO [PhantomJS 1.9.8 (Windows 8 0.0.0)]: Connected on socket NHknSeC3p_h_lf12SK Gh with id 27552356 
PhantomJS 1.9.8 (Windows 8 0.0.0) Test Should be true FAILED 
    TypeError: 'undefined' is not an object (evaluating 'otpConfigureDatasetSelectedTab.tab') 
     at otpConfigureDatasetsController (D:/workspace/..... 

我已经有所有必需的文件在karma.config.js ....

如果我在控制器中注释这两行。

//active: otpConfigureDatasetSelectedTab.tab == 'MyReviewList' 

//active: otpConfigureDatasetSelectedTab.tab == 'AllDatasets' 

的单元测试工作正常。

我的规格定义有什么问题???

回答

0

你没有保存你试图模拟的对象。你基本上只有

_otpConfigureDatasetService_ = undefined, 
_otpReviewListDatasetsService_ = undefined 

所以它不是控制器失败,这是单元测试。您正在注入undefined来代替这两个对象。我不知道你想做什么,但您可能需要定义一些模拟对象像_otpConfigureDatasetService_ = {tab: 'something'}或得到真正的服务,并调整它们

beforeEach(inject(function ($controller, $rootScope, otpConfigureDatasetService, otpReviewListDatasetsService) { 

    // 
    _otpConfigureDatasetService_ = otpConfigureDatasetService; 
    _otpReviewListDatasetsService_ = otpReviewListDatasetsService; 
    // 
    scope = $rootScope.$new(); 
    MainCtrl = $controller('otpConfigureDatasetsController', { 
     $scope: scope, otpWebMapApp: _otpWebMapApp_, otpWMDeltaTracker: _otpWMDeltaTracker_, otpWMStateCache: _otpWMStateCache_, 
     otpConfigureDatasetService: _otpConfigureDatasetService_, otpAllDatasetsService: _otpAllDatasetsService_, 
     otpReviewListDatasetsService: _otpReviewListDatasetsService_, otpConfigureDatasetSelectedTab: _otpConfigureDatasetSelectedTab_ 
    });  

})); 

BTW惯例是在注入函数来定义_object_和然后保存它。如果你注入它们的方式,那么你不需要使用_object_表格作为局部变量。

我也喜欢使用$注射器

beforeEach(inject(function($injector) { 
    exampleService = $injector.get('exampleService'); 
})); 
+0

我很欣赏你的时间,我花如2天尝试解决这个问题...但我尝试用下面的代码'beforeEach(注(函数($注射器){ otpConfigureDatasetSelectedTab = $ injector.get('otpConfigureDatasetSelectedTab'); }));'我得到了Unknow提供者错误。我也尝试第一个代码,但得到相同的错误... –

+0

它无法找到提供商/服务。有错字吗?在哪个模块中定义了服务?如果它不在'otpConfigureDatasets'中,则需要将模块加载到其定义的位置(beforeEach)。 – nomve