angularjs 单元测试何时使用 $rootScope.$new()

angularjs unit test when to use $rootScope.$new()

我真的不明白什么时候应该在我的 angular 单元测试中使用 $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() 以及它有什么用?

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

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

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

$new() is mainly used when creating a new scope out of an existing scope.

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

$new()可以在你想从父作用域中获取一些属性时使用with/without隔离。

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

请注意,手动创建的新作用域也需要手动销毁。

关于它的更多信息 here