【问题标题】:angularjs unit test when to use $rootScope.$new()angularjs 单元测试何时使用 $rootScope.$new()
【发布时间】:2015-02-16 07:59:46
【问题描述】:

我真的不明白什么时候应该在我的角度单元测试中使用 $rootScope = $rootScope.$new()。这截断了您在许多单元测试示例中看到的内容。但在以下示例中不起作用:

angular.module("app.root", []).factory("rootFct", function ($rootScope) {
    $rootScope.amount = 12;
    return {
        getAmount: function () {
           return ($rootScope.amount + 1);
        }
    }
});

相关的单元测试不起作用:

describe('Amount Tests', function() {
    var rootFct, $rootScope;

    beforeEach(function() {
        angular.mock.module("app.root");
        angular.mock.inject(function (_rootFct_, _$rootScope_) {
            $rootScope = _$rootScope_.$new();
            rootFct = _rootFct_;
        });
    });

    it('Set Amount in rootScope on 10', function() {
        var result = rootFct.getAmount();
        expect(result).toBe(13);
        $rootScope.amount = 15;
        result = rootFct.getAmount();
        expect(result).toBe(16);
    });
});

它只在我更改时有效

$rootScope = _$rootScope_.$new();

$rootScope = _$rootScope_;

所以我真的不明白什么时候使用 $new() 以及它有什么用处?

【问题讨论】:

    标签: javascript angularjs unit-testing jasmine


    【解决方案1】:

    $new() 主要用于从现有范围创建新范围时 范围。

    您的代码已经在服务中注入了 rootScope,因此它不会有任何区别。

    $new() 可以用于当你想从有/没有隔离的父作用域中获取一些属性时。

    它需要两个参数隔离和父。 如果需要与父范围隔离,则需要使用 Isolate(布尔值)。 Parent (object) 显式定义父范围。

    请注意,手动创建的新范围也需要手动销毁。

    更多信息请关注here

    【讨论】:

      【解决方案2】:

      我们知道 $rootScope 是 Angular 应用程序中的全局范围,它也适用于单元测试。 Angular 框架也会在单元测试时创建一个 $rootScope 对象。

      由于您将服务注入到测试中,Angular DI 使用全局 $rootScope 并自动将其注入到服务中。

      你做$rootScope = _$rootScope_.$new(); 不会有任何不同。在这里,您没有将依赖项注入到服务中,就像控制器的情况一样,我们使用$new 创建范围并使用$controller 注入它 您需要有原始的$rootScope 来断言您的服务行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-05
        • 2013-05-27
        • 2015-04-01
        相关资源
        最近更新 更多