我正在尝试使用 Jasmine 和 angularJS 应用程序进行 BDD。我的要求是在我的视图中创建一个选择元素,该元素从工厂获取数据。因此,本着 BDD 的真正精神,我在开始编写视图之前先编写我的工厂和控制器。
我对工厂的测试:
describe('getTypeOfUnit', function(){
it('should return typeofunits', inject(function(getTypeOfUnit){
expect(getTypeOfUnit).not.toBeNull();
expect(getTypeOfUnit instanceof Array).toBeTruthy();
expect(getTypeOfUnit.length).toBeGreaterThan(0);
})) ;
});
所以我正在测试我的数据不为空,是一个数组并且至少包含一个项目。它失败了,因为没有工厂。
这是使测试通过的工厂:
angular.module('myApp.services', [])
.factory('getTypeOfUnit', function(){
var factory = ['Research Lab', 'Acedamic Unit', 'Misc'];
return factory;
});
现在进入控制器。这是空控制器:
angular.module('myApp.controllers', [])
.controller('describeUnitController',[function($scope){
console.log('exiting describeUnit');
}]);
并测试控制器:
describe('controllers', function(){
var describeScope;
beforeEach(function(){
module('myApp.controllers');
inject(function($rootScope, $controller){
console.log('injecting contoller and rootscope in beforeEach');
describeScope = $rootScope.$new();
var describerController = $controller('describeUnitController', {$scope: describeScope});
});
}) ;
it('should create non empty "typeOfUnitsModel"', function() {
expect(describeScope["typeOfUnits"]).toBeDefined();
var typeOfUnits = describeScope.typeOfUnits;
expect(typeOfUnits instanceof Array).toBeTruthy();
expect(typeOfUnits.length).toBeGreaterThan(0);
});
});
所以我正在测试我的控制器是否返回一个非空数组。和服务一样。这些测试失败。所以下一步是在控制器的范围对象上定义一个属性:
.controller('describeUnitController',[function($scope){
$scope.typeOfUnits = [];
console.log('exiting describeUnit');
}]);
现在我收到一个错误:TypeError: Cannot set property 'typeOfUnits' of undefined
为什么控制器不知道范围?我认为DI会自动使其可用?
先感谢您。也请评论我的测试。