在AngularJS中使用Jasmine对两个控制器进行单元测试

时间:2014-07-21 06:27:53

标签: angularjs unit-testing jasmine

我正在使用AngularJS中的Jasmine编写我的第一个单元测试。我已经有一些控制器,服务等,我正在尝试验证它们(我知道:首先测试,然后编写代码,但正如我所说,我是单元测试的新手,并希望通过单元测试进一步开发我的应用程序)。

在我的情况下,我有两个控制器的视图,如

<div ng-controller="firstCtrl">
  <div ng-controller="secondCtrl"></div>
</div>

在每次页面加载时,我检查routeParameters并从WebAPI获取数据(这由第一个控制器完成)。我的第二个控制器基于数据,该数据由第一个Ctrl设置为$ scope。

我的问题是,如何以优雅的方式为secondCtrl编写单元测试?我还有第三个,第四个控制器,它依赖于第一个控制器设置的数据。如果没有必要,我不想要重复的代码。

第二个控制器:

angular.module("myApp.controllers.secondController", ["myApp.Model"])
    .controller("secondController", function ($scope, Model) {
        $scope.data.Model = Model;

        $scope.doSomething = function () {
            // tries to grab something from the scope, which would normally be set by the first Controller, e.g.
            return $scope.firstCtrlData.x;
        };
    });

规范文件:

   describe('My App', function () {
        beforeEach(angular.mock.module('myApp'));

        describe("Controller", function () {
            var controller, scope;

            beforeEach(inject(function ($rootScope,  $controller, _Model_) {
                scope = $rootScope.$new();

                controller = $controller("secondCtrl", {
                    scope: $scope,
                    Model: _Model_
                });
            }));


            it('ensures that Model is in scope.data defined', function () {
                expect($scope.data.Model).toBeDefined();
            });

            it('doSomething() does something', function () {
                var x = $scope.doeSomething();
                expect(x).toBeDefined();
                // this will fail
            });
        });
    });

它不仅仅是一个'x' - Value,它将是json Code中给出的整个数据结构,所以它可能不是最好的方法,只需将我的所有数据放在一个模拟的范围对象中...... / p>

由于我也是角色的新手,它可能甚至不是整个应用程序有两个控制器的最佳方法,但对我来说它似乎是最短和最有效的变体。

0 个答案:

没有答案