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

Angular unit testing: how to test controller properties without scope

本文关键字:范围 情况下 测试 属性 控制器 单元测试      更新时间:2023-09-26

我正试图为控制器编写一些测试,但所有关于这方面的文档/教程等都用$scope上的函数和变量进行了演示。如果你想测试一些不在$scope上的东西怎么办?

例如:

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

有没有办法对foofooBar()进行单元测试?

以下是不起作用的:

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以及CCD_ 7语法。

javascript中没有办法从外部范围访问本地(在函数内部声明)函数或变量。你有一些选择来测试这个:

  1. 声明作用域上的函数/变量
  2. 将函数/变量移动到角度服务并测试该服务
  3. 通过在使用该函数/值的范围上测试方法,间接测试函数/变量

我更喜欢将这样的函数/变量移动到角度服务,但这取决于它们的用途。