$scopeProvider <- $scope/ Unknown provider

18

我用Jasmine (http://jasmine.github.io/2.0/)测试我的Angular应用程序,但收到了以下错误信息: Unknown provider: $scopeProvider <- $scope。 我知道,在过滤器、服务、工厂等中使用作用域(scope)构建依赖是不正确的,但是我在控制器中使用$scope! 为什么会出现这种错误?该控制器如下:

testModule.controller('TestCont', ['$filter', '$scope', function($filter, $scope){

        var doPrivateShit = function(){
            console.log(10);
        };

        this.lol = function(){
            doPrivateShit();
        };

        this.add = function(a, b){
            return a+b;
        };

        this.upper = function(a){
            return $filter('uppercase')(a);
        }   

        $scope.a = this.add(1,2);

        $scope.test = 10;

        $scope.search = {

        };
    }]);

还有我的测试代码:

'use strict';

describe('testModule module', function(){
    beforeEach(function(){
        module('testModule');
    });

    it('should uppercase correctly', inject(function($controller){
        var testCont = $controller('TestCont');
        expect(testCont.upper('lol')).toEqual('LOL');
        expect(testCont.upper('jumpEr')).toEqual('JUMPER');
        expect(testCont.upper('123azaza')).toEqual('123AZAZA');
        expect(testCont.upper('111')).toEqual('111');
    }));
});

你的控制器语法是正确的。很可能你在指令或服务中引用了 $scope,这是不正确的。 - user2808895
尝试使用以下语法: angular.module('yourAppName').controller('TestCont' - Coldstar
我编辑了我的问题并添加了测试代码。 - Foker
3个回答

34
您需要手动将$scope传递给您的控制器:
describe('testModule module', function() {
    beforeEach(module('testModule'));

    describe('test controller', function() {
        var scope, testCont;

        beforeEach(inject(function($rootScope, $controller) {
            scope = $rootScope.$new();
            testCont = $controller('TestCont', {$scope: scope});
        }));

        it('should uppercase correctly', function() {
            expect(testCont.upper('lol')).toEqual('LOL');
            expect(testCont.upper('jumpEr')).toEqual('JUMPER');
            ...
        });
    });
});

但是如果您想测试控制器的$scope呢? - Guy
@Guy,你传递的作用域和控制器的作用域是同一个对象。由于它在beforeEach之外声明,因此可以在it中使用。控制器中对作用域对象所做的任何更改都将出现在测试中。 - Swoogan
那么这行代码的意思是什么: scope = $rootScope.$new(); - Guy
@Guy 在根作用域上创建一个新的子作用域,并将其分配给变量 scope - Swoogan

1
通常情况下,只有当控制器附加到DOM时,$scope才可作为可注入参数使用。
你需要以某种方式将控制器与DOM关联起来(我对Jasmine不是很熟悉)。

0

我正在跟随egghead的视频教程(下面有链接),该教程建议采用以下方法:

describe("hello world", function () {
    var appCtrl;
    beforeEach(module("app"))
    beforeEach(inject(function ($controller) {
        appCtrl = $controller("AppCtrl");
    }))

    describe("AppCtrl", function () {
        it("should have a message of hello", function () {
            expect(appCtrl.message).toBe("Hello")
        })
    })
})

控制器:

var app = angular.module("app", []);

app.controller("AppCtrl",  function () {
    this.message = "Hello";
});

我发布这个问题是因为在所选答案中,我们正在创建一个新的作用域。这意味着我们无法测试控制器的作用域变量,对吗?
视频教程链接(1分钟): https://egghead.io/lessons/angularjs-testing-a-controller

在你的示例中,你没有任何作用域变量。如果你将$scope注入到你的控制器中,你的测试将会失败,并出现OP的错误信息。如果你的控制器需要一个作用域,你必须在你的测试工具中手动注入它。请参考https://gist.github.com/Swoogan/98017f256edd37d49f42,了解如何测试作用域变量的示例。 - Swoogan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接