AngularJS $ scope。$ watch回调函数参数在Jasmine测试中未定义

时间:2014-11-25 10:33:26

标签: javascript angularjs jasmine

我在控制器上为名为$scope.$watch的范围变量定义了ctrl.test。 $ watch的回调函数在生产部署中使用正确的值(newVal)调用,但是从Jasmine测试调用时,使用undefined调用它。 直接访问ctrl.test会产生正确的值。

有人可以对此有所了解吗?这是一个Plunk来摆弄。

2 个答案:

答案 0 :(得分:3)

使用Controller As模式时,请使用函数作为监视表达式。

替换:

$scope.$watch('ctrl.test', ...

使用:

$scope.$watch(function () {
  return ctrl.test;
}, ...

新插件:http://plnkr.co/edit/4tb4nhjtdRtv8cLURWZg?p=preview

有关原因的更多信息:https://stackoverflow.com/a/25748208/2943490

答案 1 :(得分:0)

在我的情况下,最好的解决方案是保持手表通常

$scope.$watch( 'myController.varToWatch', function(newVal,oldValue) {
    //blabla
});

并将控制器范围附加到属性: $ scope.myController = myController;

beforeEach(inject(function(_$controller_, _$httpBackend_,_$rootScope_){
    $httpBackend = _$httpBackend_;
    $scope = _$rootScope_.$new();
    $controller = _$controller_;
    myController = $controller('settingsController', { $scope: $scope });
    $scope.myController = myController;
}));

受到启发:http://juristr.com/blog/2014/11/learning-ng-testing-watch-expressions/