Jasmine测试:在测试中将angularjs控制器的变量显示为未定义

时间:2016-02-15 08:38:15

标签: angularjs karma-jasmine

我无法在测试用例中获得变量,它在测试用例中显示未定义。 控制器:

   $scope.sample = function(){
      var id="151201";
      });

测试:

var ctrl, scope, ;

  beforeEach(inject(
    function($controller, $rootScope){
 scope = $rootScope.$new();
      scope.$digest();
  ctrl = $controller('controller', {
        $scope:scope
      });
  describe('scope functions', function() {
    it('sample', function() {
        expect(id).toBe('151201')
    });
});

获取错误:期望未定义为151201

2 个答案:

答案 0 :(得分:2)

1)在测试之前调用$scope.digest()而不是在初始化控制器之前。摘要通常会调用观察者,因为您还没有初始化控制器并创建了$ scope.id,所以在此之前没有运行摘要的意义。即使在控制器内,我怀疑你有一个更改值的事件,因为没有其他服务($ http)可供使用。

2)如果你有一个控制器,你有$scope.id = "test",你只需要测试它:

 expect($scope.id).toEqual("test");

P.S。 $ scope.sample = function(){var id =" 12321321"}你不能这样。首先,因为 id 变量对于样本函数是私有的。您既不会将其分配给 $ scope ,也不会分配给。另一件事是你可能想把它分配给$ scope,所以这样就会:

$scope.sample = function(){
   $scope.id = "12345";
}

#the test will look like 

it('should assign id', function(){
  $scope.sample();     

  expect($scope.id).toEqual("12345");
})

然后删除

$digest()

调用beforeEach语句。

答案 1 :(得分:0)

您的测试ID中的

未定义,您需要获取控制器的范围ID。

尝试

expect(ctrl.$scope.id).toBe('151201')

或只是console.log(ctrl)并寻找范围。也许它不是美元范围而只是范围。

编辑:

expect($scope.id).toBe('151201')

也应通过测试。