0

我正在尝试使用 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会自动使其可用?

先感谢您。也请评论我的测试。

4

1 回答 1

1

发现我的代码有两个错误:

  1. 控制器不知道 $scope。不知道为什么。所以我可以执行以下操作之一:

    .controller('describeUnitController',['$scope',function($scope){ $scope.typeOfUnits = []; console.log('exiting describeUnit'); }]);

或者

.controller('describeUnitController',function describeUnitController($scope){
            $scope.typeOfUnits = [];
            console.log('exiting describeUnit');
        });

我不确定为什么会这样。但吸取了教训。

  1. 然后我尝试按如下方式使用该服务:

    .controller('describeUnitController',function describeUnitController($scope, GetTypeOfUnit){ $scope.typeOfUnits = getTypeOfUnit; });

这给了我著名的错误:GetTypeOfUnit 的未知提供者

显然,我必须将服务模块添加到工厂模块才能使用服务并使测试通过。但是我的 app.js 都定义了它们:

angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers','ui.bootstrap','$strap.directives'])

但由于我正在测试,我还必须在控制器模块中加载服务模块。如果应用程序正在加载(如在浏览器中),我不必这样做。

我是否正确理解这一点?谢谢你们。

于 2013-04-24T02:24:10.397 回答