测试角度控制器:何时创建新范围?

时间:2014-01-17 19:34:42

标签: javascript angularjs jasmine

测试角度控制器时,是否通过调用$ rootScope.new()并不总是需要创建新的范围?

这是我的控制器:

myControllers.controller("myCtrl1", ['$scope', function($scope) {
$scope.todos = [{"name": "Learn Angular"}, {"name": "Install Karma"}];
$scope.date = '1/1/2014';   
}]);

这是我的通过测试:

describe("controllers", function() {
    var $scope, $rootScope, $controller;    

beforeEach(function() {
    module("myApp.controllers");        
}); 

beforeEach(inject(function(_$controller_) {     
    $controller = _$controller_;    
    //scope = $rootScope.new() **When would you do this?**
}));

//Basic Controller
it("sets todos on scope", function() {
    var scope = {}; //**Creating an empty scope object**
    $controller("myCtrl1", {$scope : scope});
    expect(scope.todos.length).toBe(3);
});
});

我假设每次测试控制器时都需要创建一个新的清洁范围,但显然我错了,因为上面的测试通过了。有什么解释吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

在你的情况下,它正在传递,因为你的控制器只是为范围赋值,所以它可以是任何对象。但是,例如,如果控制器必须监听事件,则测试将失败。

$scope.$on('datachange', function(event, args) {
  // do something
})

在这种情况下,您必须创建一个新的范围以使测试通过。

答案 1 :(得分:1)

这是因为您没有使用$scope$on等任何$watch方法。此外,要在测试中触发手表,您通常需要使用$scope.$digest()。当然,如果将空对象作为范围传递给控制器​​,这些都不会起作用。

取决于情况。