编辑:我设法让我的单元测试运行 - 我将包含服务的代码移动到不同的文件和不同的模块,使这个新模块成为 fooBar 模块的要求,然后在调用每个“it”块之前,引入代码beforeEach(module(<new_service_module_name))
。但是,我的应用程序仍然无法运行。控制台也没有错误。这是唯一剩下的问题——当我使用全局范围来定义控制器时,应用程序可以工作,但是当我使用 angular.module.controller 时——它不会。
我有一个app.js
包含以下内容的文件:
'use strict';
var app = angular.module('fooBar', []);
app.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/', {
templateUrl: 'partials/form-view.html',
controller: FormViewCtrl
}).
when('/resultDisplay', {
templateUrl: 'partials/table-view.html',
controller: TableViewCtrl
}).
otherwise({redirectTo: '/'});
}]);
app.service('searchResults', function() {
var results = {};
return {
getResults: function() {
return results;
},
setResults: function(resultData) {
results = resultData;
}
};
});
我有另一个文件controllers.js
,其中包含以下内容:
'use strict';
var app = angular.module('fooBar', []);
app.controller('FormViewCtrl', ['$scope', '$location', '$http', 'searchResults',
function ($scope, $location, $http, searchResults) {
//Controller code
}]);
searchResults
是我创建的一个服务,它只有 getter 和 setter 方法。上面的控制器使用 setter 方法,因此服务被注入其中。
结果,我的应用程序无法运行!如果我将控制器代码更改为全局的,如下所示:
function ($scope, $location, $http, searchResults) {
//Controller code
}
然后应用程序工作!
此外,如果我使用全局范围,则以下单元测试用例有效:
'use strict';
/*jasmine specs for controllers go here*/
describe('Foo Bar', function() {
describe('FormViewCtrl', function() {
var scope, ctrl;
beforeEach(module('fooBar'));
beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new();
ctrl = $controller('FormViewCtrl', {$scope: scope});
}));
}
//"it" blocks
}
如果我恢复到模块范围,我会收到错误 -
Error: Unknown provider: searchResultsProvider <- searchResults
因此,通过使用全局范围,我的应用程序和单元测试运行,但通过使用 app.controller,它们似乎中断了。
我注意到的另一点是,如果我将控制器代码包含在app.js
而不是 中controllers.js
,那么应用程序和单元测试将再次开始工作。但是我不能将它们包含在同一个文件中 - 如何在不破坏应用程序和单元测试的情况下让它在角度范围内运行?