2014-01-17 62 views
1

在测试角度控制器时,通过调用$ 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

在你的情况下,它正在通过,因为你的控制器只是给值赋值,所以它可以是任何对象。但是,举例来说,如果控制器不得不听一个事件,那么测试就会失败。

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

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

+0

一般而言,我只是简单地创建一个新的范围,并称它为一天。它们很便宜,当您决定切换实施时,您不必重构大量代码。这就是说,很好的答案。 :) –

1

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

取决于情况。

相关问题