【问题标题】:controller $scope variables undefined in jasmine tests茉莉花测试中未定义的控制器 $scope 变量
【发布时间】:2016-01-07 20:43:58
【问题描述】:

我正在使用 Karma 和 Jasmine 编写我的第一个 Angular 应用测试。

我有一个具有此功能的控制器:

function getMyLists() {
  getLists.getOne().then(function(listOne) {
    $scope.list1 = listOne[0];
    list1Available = true;
  });
  getLists.getTwo().then(function(listTwo) {
    $scope.list2 = listTwo;
    list2Available = true;
  });
}

getMyLists();

我已经在测试中模拟了服务

describe('MainCtrl', function () {

  var rootScope, scope, controller, myService;

  beforeEach(angular.mock.module('myApp'));

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

    myService = {
      getOne: function(){
        // mock promise
        var deferred = $q.defer();
        deferred.resolve([
          {
            "one": 1
         },
         {
            "type": list
         }
        ]);
        return deferred.promise;
      },
      getTwo: function(){
        // mock promise
        var deferred = $q.defer();
        deferred.resolve([
          {
            "two": 2
         },
         {
            "type": list
         }
        ]);
        return deferred.promise;
      }
    }

    controller = $controller('MainCtrl', {
      $scope: scope,
      myService: myService
    });
  }));

  it('should call myService service and populate the array', function(){
    scope.$digest();
    expect(scope.list1.length).toBeGreaterThan(0);
  });

});

这很好用,正如我所期望的那样,我通过了测试。但是当我尝试测试以下示例时,我不断收到错误。

expect(scope.list2.length).toBeGreaterThan(0);
Expected undefined to be greater than 0.

expect(list1Available).toEqual(false);
ReferenceError: Can't find variable: list1Available

就像我说的这些是我的第一次测试,所以任何帮助都非常感谢!

【问题讨论】:

    标签: javascript angularjs unit-testing karma-jasmine


    【解决方案1】:

    试试 $rootScope.$digest(); //解决/拒绝承诺

     it('should call myService service and populate the array', function(){
        $rootScope.$apply();
        expect(scope.list1.length).toBeGreaterThan(0);
      });
    

    您需要将 list1Available && scope.list2Available 附加到 $scope 以便可以在控制器之外访问它们。

    function getMyLists() {
      getLists.getOne().then(function(listOne) {
        $scope.list1 = listOne[0];
        $scope.list1Available = true;
      });
      getLists.getTwo().then(function(listTwo) {
        $scope.list2 = listTwo;
        $scope.list2Available = true;
      });
    }
    

    您的测试需要测试 scope.list1Available

    expect(scope.list1Available).toEqual(false);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2013-06-16
      相关资源
      最近更新 更多