Javascript jasmine形式效度的AngularJS单元测试在手表断裂测试中的应用
我正在努力找出我遗漏了什么,在谷歌搜索了5个小时后,我还没有找到答案,所以这是我最后一次尝试 我有一个AngularJS应用程序,在其中一个单元测试中,我检查控制器在api调用后是否显示一些数据。我的问题是我在控制器上有一块手表,它正在运行一些日期验证,它正在破坏我的测试。如果我取下手表,测试就可以通过。我从测试中得到的错误如下: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
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?我在此表示歉意,因为据我所知,我对安格拉来说还很陌生。在测试之外,你的示例在你的应用程序中有效吗?你不应该真的在你的控制器中使用表单。这就是当应用程序运行并且已经运行了一段时间后,代码可以正常工作的地方。只是单元测试失败了,但看起来单元测试是对的,代码是错的。我假设任何自定义验证都应该使用指令执行,对吗?你是对的,你可能应该在指令中执行。请参阅自定义验证:。