如何设置范围变量,测试控制器,然后更改范围变量并重新加载控制器?

时间:2014-11-07 18:17:17

标签: angularjs unit-testing jasmine karma-runner

我的控制器代码中有这样的东西。

$scope.parsedDisabled = $scope.isDisabled === 'true' ? true : false;

这不在任何类型的函数中运行,它是创建控制器时运行的第一行代码。

因此,当我进行单元测试时,我有类似的东西:

beforeEach(inject(function ($rootScope, $controller, $filter) {
        scope = $rootScope.$new();
        filter = $filter;
        scope.isDisabled = 'true';
        controller = $controller('toggleRadioController', {
            $scope: scope
        });
    }));

    describe('test stuff', function(){
        it('Should set to true', function(){
            expect(scope.parsedDisabled).toBe(true);
        });
    });

所以这一切都很好,但我希望能够运行相同的测试,但将scope.isDisabled设置为'false',然后再将其设置为undefined。我的问题是,在实际加载控制器之前,显然需要将其更改为false和undefined ,在这种情况下我不知道如何做到这一点。我已经尝试过使用嵌套的beforeEach(),但是我无法使用它。

1 个答案:

答案 0 :(得分:0)

首先,按照测试的相同顺序定义包含 isDisabled 值的数组。 然后创建一个计数器,增加 afterEach 测试。最后,将 scope.isDisabled 设置为 array [counter]

就是这样:

describe('test stuff', function(){
    var disabledValues = ['true', 'false', undefined],
        counter = 0;

    beforeEach(module('plunker'));
    beforeEach(inject(function ($rootScope, $controller, $filter) {
        scope = $rootScope.$new();
        filter = $filter;
        scope.isDisabled = disabledValues[counter];
        controller = $controller('toggleRadioController', {
            $scope: scope
        });
    }));
    afterEach(function() {
        counter += 1;
    });


    it('"true" should set to true', function(){
        expect(scope.parsedDisabled).toBe(true);
    });

    it('"false" should set to false', function(){
        expect(scope.parsedDisabled).toBe(false);
    });

    it('"undefined" should set to false', function(){
        expect(scope.parsedDisabled).toBe(false);
    });
});

这是一个plunker