2014-05-07 62 views
11

我正在研究如何使用茉莉花與噶瑪。我試圖注入範圍到我的控制器和從什麼地方我拿起這個代碼...

var scope = { message: 'hello' }; 

beforeEach(angular.mock.module('myApp')); 

beforeEach(angular.mock.inject(function ($rootScope, $controller) { 

    scope = $rootScope.$new(); 

    $controller('myController', { $scope: scope }); 

})); 

的問題是,範圍被消滅了與線...

scope = $rootScope.$new(); 

所以我可以評論它,但我想知道這條線的用途是什麼?我什麼時候打電話給$rootscope.$new()?我明白這是與隔離有關,但我並沒有真正得到它的實際應用。

更新:正如蒂姆指出,這是一個問題,因爲我已經宣佈了我自己的範圍。因此,我可以修改代碼是....

var scope; 

beforeEach(angular.mock.module('myApp')); 

beforeEach(angular.mock.inject(function ($rootScope, $controller) { 

    scope = $rootScope.$new(); 

    scope.message = 'hello'; 

    $controller('myController', { $scope: scope }); 

})); 

這更象預期,但我仍然不知道,最好的方法是什麼?什麼是$rootscope.$new()甚至?

+0

'的問題是範圍被消滅與line'我認爲實際的「問題」是你*定義*你自己的'var scope' –

+0

好吧,現在你說得有道理。考慮到這是最好的方法? – Exitos

+0

你爲什麼不使用Yeoman並讓它設置你的茉莉/業力配置? – mortsahl

回答

3

作用域的角度嵌套在父子關係,全部來自一個單親$rootScope

這是獲得怎樣的角度創建被注入到你的控制器$scope因此它創建的時候,你是單元測試相同的經歷你控制器。

如果您在控制器中執行任何操作,需要您調用$ apply而不是您必須嘲笑它​​,那麼這非常有用。

11

$rootScope.$new創建一個$rootScope.Scope的新實例,該實例繼承自$rootScope。換句話說,它創建了一個新的子範圍$rootScope

您可能會在測試中使用它的原因(例如您發佈的測試),是因爲您的其他選擇是使用$rootScope本身。這樣做可能會造成混亂,因爲它可能會在整個地方使用。

我認爲最好的做法是爲每個測試用例創建一個新的範圍(並在之後銷燬)。

這裏是你的例子改寫,我認爲最好的做法:

describe('myModule', function() { 

    var $rootScope; 

    beforeEach(module('myModule')); 

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

    describe('myController', function() { 

     var $scope; 

     beforeEach(function createChildScopeForTheTest() { 
      $scope = $rootScope.$new(); 
     }); 

     afterEach(function disposeOfCreatedChildScope() { 
      $scope.$destroy(); 
     }); 

     it('tests something', function() { 
      $scope.message = 'hello'; 

      $controller('myController', { $scope: $scope }); 

      expect($scope.something).toEqual('world'); 
     }); 
    }); 
}); 
+0

我喜歡這個例子。有一個問題,如果我試圖在afterEach塊中銷燬範圍,我會得到一個錯誤。似乎這個範圍已經被清理和銷燬。 – SuneRadich

+1

我在所有測試中都使用它,其中我已超過10000個。我從未遇到過這個問題。這可能是由於你在測試中做了其他事情。發佈一些代碼,如果你想幫助修復:-) – eitanfar

相關問題