2014-10-27 74 views
18

我測試我的角度應用茉莉花(http://jasmine.github.io/2.0/),並獲得下一個錯誤: 未知提供商:$ scopeProvider < - $範圍 我知道,這是不正確的建立與範圍的依賴在過濾器,服務,工廠等,但我在控制器中使用$ 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'); 
    })); 
}); 
+0

哪裏是你的測試? – PSL 2014-10-27 15:52:31

+0

您的控制器中的語法是正確的。很可能你在指令或服務中引用$ scope,這是不正確的。 – user2808895 2014-10-27 15:56:57

+0

試試這個語法: angular.module('yourAppName').controller('TestCont' – Coldstar 2014-10-28 08:13:52

回答

1

通常情況下,$範圍將作爲只有當控制器連接到DOM的注射PARAM。

你需要以某種方式將控制器關聯到DOM(我完全熟悉茉莉花)。

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'); 
      ... 
     }); 
    }); 
}); 
+0

但是,如果您想測試控制器的$範圍? – Guy 2015-09-28 22:40:56

+0

@Guy你傳入的範圍和控制器的作用域是同一個對象,因爲它是在'beforeEach'之外聲明的,所以它可以在'it'中使用,控制器中作用域對象的任何修改都是 – Swoogan 2015-09-30 01:06:37

+0

那麼這行的含義是什麼: scope = $ rootScope。$ new(); – Guy 2015-09-30 10:39:49

0

我下面從理論家(鏈接波紋管)的視頻教程這表明這種方法:

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

在你的例子中你沒有任何範圍變量。如果你在你的控制器中注入'$ scope',你的測試將失敗並顯示OP的錯誤信息。如果您的控制器需要一個範圍,您必須手動將其注入您的測試工具。有關測試範圍變量的示例,請參閱https://gist.github.com/Swoogan/98017f256edd37d49f42。 – Swoogan 2015-09-30 01:26:08

相關問題