找不到变量:$rootScope

Can't find variable: $rootScope

我是单元测试的新手,尽管我的测试是正确的,但我还是遇到了这些错误,但我只是无法弄清楚这些错误是什么意思,我已经尝试了几种方法

 Can't find variable: $rootScope
 Error: Injector already created, can not register a module!

spec.js

   describe('test broadcast', function () {
    var $controller;

    beforeEach(function() {
        module('test');
        inject(function (_$rootScope_, _$controller_) {
            $rootScope = _$rootScope_;
            spyOn($rootScope, '$broadcast');

            // Notice how inject $controller here.
            $controller = _$controller_;
        });
    });

    it("should broadcast something", function ($rootScope) {
        $controller('myCtrl', {
            // Pass in the $rootScope dependency.
            $rootScope: $rootScope.$new()
        })
        // Here we actually run the controller.
        expect($rootScope.$broadcast).toHaveBeenCalledWith('update');
        //someObj = { data: testData};
        //expect($rootScope.$broadcast).toHaveBeenCalledWith('update', someObj);
    });
})

控制器

(function () {

    var test= angular.module('test');

    test.controller('myCtrl',
        function($rootScope, $scope, $resource, $location, $route, $routeParams, $log, catalogData) {

            $log.debug("myCtrl");
            $log.debug(myCtrl);

            $rootScope.$broadcast("update", {
                data: testData
            });
        }); // catalogCtrl
})();

您定义了一个名为 rootScope 的变量,而不是 $rootScope - 更改您的定义:

rootScope.$apply();

虽然我个人喜欢这样定义它们:

var $rootScope;
beforeEach(inject(function(_$rootScope_) {
    $rootScope = _$rootScope_;
}));

编辑 2:

您无法在 it 函数中访问 $rootScope,因为它不在当前 javascript scope 中(不是 angular $scope,不要不要混淆)。

您需要在顶部的控制器旁边定义它。

var $controller, $rootScope

并从您的 it 函数中删除 $rootScope,这样您就不会覆盖它。

// Notice there is no $rootScope parameter.
it("should broadcast something", function () {
    //Code
}

您还必须传入其他依赖项。 与 OP 讨论后,整个代码应如下所示:

describe('test broadcast', function () { 
    var $controller, $rootScope; 

    beforeEach(function() { 
        module('test'); 
        inject(function (_$rootScope_, _ $controller_) { 
        $rootScope = _$rootScope_; 
        spyOn($rootScope, '$broadcast'); 
        $controller = _$controller_; 
     }); 
}); 

it("should broadcast something", function () { 
    $controller('myCtrl', { 

        $scope: $rootScope.$new(), 

         catalogData: {} 
    }) 
    expect($rootScope.$broadcast).toHaveBeenCalledWith('update', {catalog:{}})}); 
})

编辑 1:

您正在传递 $scope 依赖项。 $broadcast$rootScope 上调用,因此您需要将其传入。像这样:

var testScope = $rootScope.$new()
$controller('myCtrl', {
    // Pass in the $rootScope dependency.
    $rootScope: testScope
}

原始post(以防它对任何人仍然有用)

您实际上并没有在测试套件的任何地方调用您的控制器。

你需要有类似的东西

var $controller
beforeEach(inject(function (_$rootScope_, _$controller_) {
    $rootScope = _$rootScope_;
    spyOn($rootScope, '$broadcast'); 

    // Notice how inject $controller here.
    $controller = _$controller_;
}));

然后在你的测试中初始化它:

it("should broadcast something", function () {
    // Here we actually run the controller.
    $controller('myCtrl', {
        // Pass in the $rootScope dependency.
        $rootScope: $rootScope.$new()
    }
    expect($rootScope.$broadcast).toHaveBeenCalledWith('catalogUpdate');
    someObj = { catalog: catalogData};
    expect($rootScope.$broadcast).toHaveBeenCalledWith('catalogUpdate', someObj);
});  

这将消除有关 $rootScope.broadcast 未被调用的错误。

看看这里的 "Testing Controllers" 部分:https://docs.angularjs.org/guide/controller

至于无法注册模块,如果您在 beforeEach(module('abc')) 之前有一个 inject(),通常会发生这种情况。 如错误所述,调用 inject 后无法注册另一个模块。