web-dev-qa-db-ja.com

$ scopeProvider <-$ scope /不明なプロバイダー

私はjasmine( http://jasmine.github.io/2.0/ )で角度アプリケーションをテストし、次のエラーを取得します:不明なプロバイダー:$ scopeProvider <-$ 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');
    }));
});
18
Foker

$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');
            ...
        });
    });
});
34
Swoogan

通常、$ scopeは、コントローラーがDOMに接続されている場合にのみ、注入可能なパラメーターとして使用できます。

どういうわけか、コントローラーをDOMに関連付ける必要があります(私はジャスミンについてはよく知っています)。

1
Dan Ochiana

私はこのアプローチを提案する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

0
Guy