【问题标题】:Angular unit testing: how to test controller properties without scope角度单元测试:如何在没有范围的情况下测试控制器属性
【发布时间】:2015-02-04 11:10: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');
        });
    });
   ...

【问题讨论】:

    标签: javascript angularjs unit-testing jasmine


    【解决方案1】:

    你不能。变量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/ngControllercontroller as 语法。

    【讨论】:

      【解决方案2】:

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

      1. 在范围内声明函数/变量。
      2. 将函数/变量移至角度服务并测试该服务
      3. 通过在使用该函数/值的范围内测试方法来间接测试函数/变量

      我更喜欢将此类函数/变量移至角度服务,但这取决于它们的目的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-09
        • 2010-11-05
        • 1970-01-01
        • 2013-06-16
        • 2014-05-20
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        相关资源
        最近更新 更多