单元测试 – 嵌套控制器的单元测试

前端之家收集整理的这篇文章主要介绍了单元测试 – 嵌套控制器的单元测试前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在为一个嵌套的控制器编写单元测试,但是无法弄清我在测试中如何模拟同样的行为.

我有2个控制器

function FirstController ($scope) {
    $scope.childs = [{
         title : 'Hello,earth!'
    }];
};

function SecondController ($scope) {
    $scope.child.title = $scope.child.title + $scope.$index;
};

在我的HTML中:

<div data-ng-controller="FirstController">
    <div data-ng-repeat="child in childs" data-ng-controller="SecondController">
        {{ child.title }}
    </div>
</div>

这样可以预期(http://jsfiddle.net/tcayp/1/)

单位测试:

// FirstController
it('Should have childs',function () {
    scope = {};
    ctrl = new FirstController(scope);
    expect(scope.childs.length).toBeGreaterThan(0);
});
// SecondController
it('Should have inherited a child',function () {
    scope = {};
    ctrl = new SecondController(scope);
    expect(scope.child.title).toEqual('Hello,earth!0');
});

在第二次控制器测试中,我无法弄清楚如何从ng-repeat模拟继承链.

理想情况下,使用单元测试,我们将单独测试类(单位).在一个测试中测试2控制器可能太多:测试将变得更加复杂和更脆弱.

仔细观察所提供的示例,可能会注意到,实际上并不是测试2个控制器,而是确保数据在父范围内可用.所以,只关注一个控制器(SecondController)和继承的数据,可以这样写一个测试:

describe('Testing the SecondController controller',function() {

    var $parentScope,$scope,ctrl;
    it('should prepare title',inject(function($rootScope,$controller) {

        //setup hierarchy of scopes with data             
        $rootScope.childs = [{
            title : 'Hello,earth!'
        }];
        $scope = $rootScope.$new();
        $scope.$index = 1;

        ctrl = $controller('SecondController',{
            $scope: $scope
        });

        expect($scope.childs[0].title).toEqual('Hello,earth!1');        
    }));
});

这是完整的jsFiddle:http://jsfiddle.net/pkozlowski_opensource/h8xry/13/

我真的建议不要一起测试两个控制器,只是为了回答这个问题,这也是可能的:

describe('Testing the SecondController controller',function() {

    it('should prepare title',$controller) {

        $controller('FirstController',{
            $scope: $rootScope
        });

        var $scope = $rootScope.$new();
        $scope.$index = 1;

        ctrl = $controller('SecondController',earth!1');        
    }));
});

和jsFiddle:http://jsfiddle.net/pkozlowski_opensource/4Qy6b/1/

猜你在找的Angularjs相关文章