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

AngularJS $scope.$watch callback function parameter undefined in Jasmine test

本文关键字:回调 参数 未定义 函数 测试 scope watch Jasmine AngularJS      更新时间:2023-09-26

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

有人能对此有所了解吗?这里有一个可以摆弄的 Plunk。

使用控制器作为模式时,请使用函数作为监视表达式。

取代:

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

跟:

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

新普伦克:http://plnkr.co/edit/4tb4nhjtdRtv8cLURWZg?p=preview

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

就我而言,最好的解决方案是像往常一样保持手表

$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/