测试角度控制器时,是否通过调用$ 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);
});
});
我假设每次测试控制器时都需要创建一个新的清洁范围,但显然我错了,因为上面的测试通过了。有什么解释吗?
提前致谢!
答案 0 :(得分:2)
在你的情况下,它正在传递,因为你的控制器只是为范围赋值,所以它可以是任何对象。但是,例如,如果控制器必须监听事件,则测试将失败。
$scope.$on('datachange', function(event, args) {
// do something
})
在这种情况下,您必须创建一个新的范围以使测试通过。
答案 1 :(得分:1)
这是因为您没有使用$scope
或$on
等任何$watch
方法。此外,要在测试中触发手表,您通常需要使用$scope.$digest()
。当然,如果将空对象作为范围传递给控制器,这些都不会起作用。
取决于情况。