私は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');
}));
});
$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は、コントローラーがDOMに接続されている場合にのみ、注入可能なパラメーターとして使用できます。
どういうわけか、コントローラーをDOMに関連付ける必要があります(私はジャスミンについてはよく知っています)。
私はこのアプローチを提案する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