角度单元测试:如何在没有范围的情况下测试控制器属性

我正在尝试为控制器编写一些测试,但是此文档上的所有文档/教程/ etc均使用$scope上的函数和变量进行了演示.如果您想测试不在$scope上的东西怎么办?

例如:

app.controller('fakeCtrl', function($scope) {

    var foo = 'bar';

    function fooBar() {
        console.log('foo bar');
    }

});

有什么方法可以对foo或fooBar()进行单元测试?

这是行不通的:

describe("fake controller", function(){

    beforeEach(module('app'));

    var $controller;

    beforeEach(inject(function(_$controller_, $rootScope){
        $controller = _$controller_;
        $scope = $rootScope.$new();
    }));

    describe('foo property', function() {
        it('is bar', function() {
          var controller = $controller('fakeCtrl', { $scope: $scope });
          expect(controller.foo).toEqual('bar');
        });
    });
   ...

解决方法:

你不能.在控制器构造函数的范围之外,无法访问变量foo和函数fooBar.但是,您可以执行以下操作:

app.controller('fakeCtrl', function($scope) {
  this.foo = 'bar';
  this.fooBar() {
    console.log('foo bar');
  }
});

然后:

(...)
describe('foo property', function() {
    it('is bar', function() {
      var controller = $controller('fakeCtrl', { $scope: $scope });
      expect(controller.foo).toEqual('bar');
    });
});

在测试中,您将foo描述为属性,但是在控制器中,foo只是变量而不是属性.

编辑:检查https://docs.angularjs.org/api/ng/directive/ngController和控制器作为语法.

上一篇:javascript-在Jasmine测试中未定义AngularJS $scope.$watch回调函数参数


下一篇:javascript-Jasmine,Angular的“ rootScope.$broadcast”测试