如何在Jasmine中测试Angular控制器的局部变量

时间:2013-01-10 23:25:28

标签: unit-testing angularjs jasmine

我有一个带局部变量的控制器

function IndexCtrl($scope) {
  var pagesById = [];
  loadPages();

  // snip

  function loadPages() {
    // pagesById gets populated
  }

  // snip
}

我想测试pagesById是否正确填充但我不知道如何从我的it()获取它。我不需要将此变量放在$ scope中,它只是一组中间信息,所以如果我可以避免将它添加到$ scope中那么理想。

it('scope.pages should populated based on pages data.', function() {
    $httpBackend.flush();
    expect(pagesById).toEqualData(mock_page_results);
});

给了我

ReferenceError: pagesById is not defined

除了将其附加到$ scope之外,我还有其他选择吗?

2 个答案:

答案 0 :(得分:16)

在茉莉花规格中,首先创建控制器:

var ctrl;

beforeEach(inject(function($rootScope, $controller) {
  scope = $rootScope.$new();
  ctrl = $controller('myController', {
     $scope: scope
  });
}));

然后,您可以通过ctrl.pagesById访问其属性。当然,您需要在控制器中使用var pagesById,而不是this.pagesById

答案 1 :(得分:1)

这是我在Angular方法中测试局部变量的方法:

//------- Function for getting value of local variables

function getLocalVariable(sLocalVarName, obj, method, args){
    method = method.toString();
    let changedMethod = method.substring(0, method.lastIndexOf("}")) + ";" + "return " + sLocalVarName + "}";
    eval(' changedMethod = ' + changedMethod);

    return changedMethod.call(obj, args)
}

//----------- service

class assignStuffService {

    getAvaliableStuff(shift) {
        const params = {
            agency_id: 0 ,
            start_time: shift.data.shift.start_time,
            end_time : shift.data.shift.end_time
        };
    }
}

//----------- part of spec

it('should set values to "params" object props', () => {

            let shift = {
                data:{
                    shift:{
                        start_time:'',
                        end_time:''
                    }
                }
            };

            let params = getLocalVariable('params',
                                            assignStuffService,
                                            assignStuffService.getAvaliableStuff,
                                            shift);

            expect(params).toEqual({
                agency_id: 0 ,
                start_time: shift.data.shift.start_time,
                end_time : shift.data.shift.end_time
            });

        });