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

squ*_*hel 2 javascript unit-testing jasmine angularjs

我真的不明白我应该在角度单位测试中使用$ rootScope = $ rootScope.$ new().你在许多单元测试例子中看到了这个断言.但在以下示例中不起作用:

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

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

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);
    });
});
Run Code Online (Sandbox Code Playgroud)

它只适用于我改变它的时候

$rootScope = _$rootScope_.$new();
Run Code Online (Sandbox Code Playgroud)

$rootScope = _$rootScope_;
Run Code Online (Sandbox Code Playgroud)

所以我真的不明白何时使用$ new()以及它的好处?

V31*_*V31 6

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

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

如果要从父作用域获取某些属性,可以使用$ new(),可以使用/不使用隔离.

它需要两个params isolate和parent.如果需要与父作用域隔离,则需要使用Isolate(boolean).父(对象)显式定义父范围.

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

更多关于这里