Javascript jasmine形式效度的AngularJS单元测试在手表断裂测试中的应用

Javascript jasmine形式效度的AngularJS单元测试在手表断裂测试中的应用,javascript,angularjs,unit-testing,jasmine,Javascript,Angularjs,Unit Testing,Jasmine,我正在努力找出我遗漏了什么,在谷歌搜索了5个小时后,我还没有找到答案,所以这是我最后一次尝试 我有一个AngularJS应用程序,在其中一个单元测试中,我检查控制器在api调用后是否显示一些数据。我的问题是我在控制器上有一块手表,它正在运行一些日期验证,它正在破坏我的测试。如果我取下手表,测试就可以通过。我从测试中得到的错误如下: Result Message: TypeError: 'undefined' is not a function (evaluating '$scope.filter

我正在努力找出我遗漏了什么,在谷歌搜索了5个小时后,我还没有找到答案,所以这是我最后一次尝试

我有一个AngularJS应用程序,在其中一个单元测试中,我检查控制器在api调用后是否显示一些数据。我的问题是我在控制器上有一块手表,它正在运行一些日期验证,它正在破坏我的测试。如果我取下手表,测试就可以通过。我从测试中得到的错误如下:

Result Message: TypeError: 'undefined' is not a function (evaluating '$scope.filterOrdersForm.txtDateFrom.$setValidity('txtDateFromValid', true)')
这是我的手表发出的代码:

$scope.checkSearchCriteriaDateValidity = function() {
     var dateFrom = moment($scope.searchCriteria.dateFrom);
     var dateTo = moment($scope.searchCriteria.dateTo);

     // check each date for validity
     if (dateFrom.isValid() !== true) {               
         $scope.filterOrdersForm.txtDateFrom.$setValidity('txtDateFromValid', false);
     } else {
         $scope.filterOrdersForm.txtDateFrom.$setValidity('txtDateFromValid', true);
     }

     if (dateTo.isValid() !== true) {
         $scope.filterOrdersForm.txtDateTo.$setValidity('txtDateToValid', false);
     } else {
         $scope.filterOrdersForm.txtDateTo.$setValidity('txtDateToValid', true);
     }

     // check if both are valid and if so make sure from date is before to date
     if (dateFrom.isValid() && dateTo.isValid()) {
          if (dateFrom.isAfter(dateTo)) {
               $scope.filterOrdersForm.txtDateFrom.$setValidity('fromBeforeTo', false);
          } else {
               $scope.filterOrdersForm.txtDateFrom.$setValidity('fromBeforeTo', true);
          }
     }
};

有人能指出我遗漏了什么吗。我是否需要对我的测试做一些特殊的处理来应对这种情况?任何帮助都将不胜感激。

我希望我的回答对您有所帮助。问题是,
$setvalidity
是一个在jasmine脚本执行方法时处于未定义状态的方法。为了解决这个问题,您必须在调用相应的方法之前为set validity创建一个mock方法

请在it方法中尝试以下代码

 $scope.filterOrdersForm = {txtDateFrom : {$setValidity: function (var1,var2){ return true }}};
 Spyon( $scope.filterOrdersForm.txtDateFrom,"$setValidity");

你是如何将表单放入控制器的?我没有做任何事情将表单放入控制器。我以为Angular把表单注入了$scope?我在此表示歉意,因为据我所知,我对安格拉来说还很陌生。在测试之外,你的示例在你的应用程序中有效吗?你不应该真的在你的控制器中使用表单。这就是当应用程序运行并且已经运行了一段时间后,代码可以正常工作的地方。只是单元测试失败了,但看起来单元测试是对的,代码是错的。我假设任何自定义验证都应该使用指令执行,对吗?你是对的,你可能应该在指令中执行。请参阅自定义验证:。