Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 棱角形/茉莉花:can';测试时无法获得通过的值_Javascript_Angularjs_Testing_Karma Runner_Karma Jasmine - Fatal编程技术网

Javascript 棱角形/茉莉花:can';测试时无法获得通过的值

Javascript 棱角形/茉莉花:can';测试时无法获得通过的值,javascript,angularjs,testing,karma-runner,karma-jasmine,Javascript,Angularjs,Testing,Karma Runner,Karma Jasmine,我写了一个允许我更改密码的页面。代码工作正常,它完成了我想要它做的一切,所以我开始编写测试。由于我在角度测试方面没有经验,这已经证明是相当困难的,我无法通过此错误: TypeError: 'undefined' is not an object (evaluating 'plan.apply') at /Users/denniegrondelaers/asadventure/myproject-web/src/users/controllers/userPasswordControlle

我写了一个允许我更改密码的页面。代码工作正常,它完成了我想要它做的一切,所以我开始编写测试。由于我在角度测试方面没有经验,这已经证明是相当困难的,我无法通过此错误:

TypeError: 'undefined' is not an object (evaluating 'plan.apply')
    at /Users/denniegrondelaers/asadventure/myproject-web/src/users/controllers/userPasswordController.js:9
    at /Users/denniegrondelaers/asadventure/myproject-web/test/unitTests/specs/users/controllers/userPasswordControllerSpec.js:98
控制员: userPasswordController.js

users.controllers.controller('userPasswordController',
    ['$scope', 'Session', '$state', 'UserService', 'languages',
        function ($scope, Session, $state, UserService, languages) {

            $scope.languages = languages;
            $scope.password = "";
            $scope.notEqual = false;
            $scope.isSuccessful = false;

            $scope.changePassword = function() {
                var pw = {
                    userId: Session.getCurrentSession().userId,
                    oldPassword: encrypt($scope.password.oldPassword),
                    newPassword: encrypt($scope.password.newPassword),
                    newPasswordRepeat: encrypt($scope.password.newPasswordRepeat)
                };

                if (pw.newPassword === pw.newPasswordRepeat) {
                    $scope.notEqual = false;

                    UserService.setNewPassword(pw).then(function(res) {
                            $scope.formErrors = undefined;
                            $scope.isSuccessful = true;
                     }, function (error) {
                            $scope.formErrors = error.data;
                        }
                    );
                } else {
                    $scope.notEqual = true;
                }
            };

            var encrypt = function (password) {
                var encrypted = CryptoJS.md5(password);
                return encrypted.toString(CryptoJS.enc.Hex);
            };
        }
    ]
);
服务: userService.js

userService.setNewPassword = function (password) {
        return $http
            .put(EnvironmentConfig.endpointUrl +
            "/password/change", password)
    };
测试: userPasswordControllerSpec.js

describe('Users', function () {
    describe('Controllers', function () {
       fdescribe('userPasswordController', function () {

           var $scope,
               controller,
               $q,
               willResolve,
               mockSession,
               mockState,
               mockUserService,
               mockLanguages;

           beforeEach(function () {

               module('mysite.users.controllers');

               module(function ($provide) {
                   $provide.value('translateFilter', function (a) {
                       return a;
                   });

                   $provide.value('$state', function (a) {
                       return a;
                   });
               });

               mockSession = {
                   getCurrentSession: function () {
                       return {userId: 4};
                   }
               };

               mockState = {
                   params: {
                       id: 1
                   },
                   go: function () {

                   }
               };

               mockLanguages = {
                   getLanguages : function () {
                       var deferred = $q.defer();
                       deferred.resolve({
                           data: [{}]
                       });
                       return deferred.promise;
                   }
               };

               mockUserService = {
                   setNewPassword : function () {
                       var deferred = $q.defer();
                       if (willResolve) {
                           deferred.resolve({
                               data: [{}]
                           });
                       }
                       return deferred.promise;
                   }
               };

               inject(function (_$q_, $controller, $rootScope) {
                   controller = $controller;
                   $q = _$q_;
                   $scope = $rootScope.$new();
               });

               controller('userPasswordController', {$scope: $scope, Session: mockSession, $state: mockState,
                   UserService: mockUserService, languages: mockLanguages
                   });
               willResolve = true;
           });


           it('should change password', function () {
               spyOn(mockUserService, 'setNewPassword').and.callThrough();
               spyOn(mockState, 'go').and.callThrough();
               spyOn(mockSession, 'getCurrentSession').and.callFake();

               expect(mockUserService.setNewPassword).not.toHaveBeenCalled();
               expect($scope.isSubmitable()).not.toBeTruthy();

               $scope.compareStoreSelection = function () {
                   return true;
               };

               $scope.password = {
                   oldPassword: "123456",
                   newPassword: "password",
                   newPasswordRepeat: "password"
               };

               expect($scope.isSubmitable()).toBeTruthy();

>>>            $scope.changePassword();           <<< LOCATION OF ERROR, line 98
               expect(mockUserService.setNewPassword).toHaveBeenCalled();
               $scope.$apply();

           });
       });
    });
});
description('Users',function(){
描述('Controllers',function(){
fdescribe('userPasswordController',函数(){
var$scope,
控制器,
$q,
决心,
第二届会议,
莫克州,
mockUserService,
模仿语言;
beforeach(函数(){
模块('mysite.users.controllers');
模块(功能($提供){
$provide.value('translateFilter',函数(a){
返回a;
});
$provide.value(“$state”,函数(a){
返回a;
});
});
模拟会话={
getCurrentSession:函数(){
返回{userId:4};
}
};
模拟状态={
参数:{
身份证号码:1
},
go:函数(){
}
};
模拟语言={
getLanguages:函数(){
var deferred=$q.deferred();
推迟,解决({
数据:[{}]
});
回报。承诺;
}
};
mockUserService={
setNewPassword:函数(){
var deferred=$q.deferred();
如果(将解决){
推迟,解决({
数据:[{}]
});
}
回报。承诺;
}
};
注入(函数($q_$controller,$rootScope){
控制器=$controller;
$q=$q;
$scope=$rootScope.$new();
});
控制器('userPasswordController',{$scope:$scope,会话:mockSession,$state:mockState,
UserService:mockUserService,语言:mockLanguages
});
willResolve=true;
});
它('应该更改密码',函数(){
spyOn(mockUserService,'setNewPassword')。和.callThrough();
spyOn(mockState,'go')。和.callThrough();
spyOn(mockSession,'getCurrentSession')。和.callFake();
expect(mockUserService.setNewPassword).not.toHaveBeenCalled();
expect($scope.isSubmitable()).not.toBeTruthy();
$scope.compareStoreSelection=函数(){
返回true;
};
$scope.password={
旧密码:“123456”,
新密码:“密码”,
newPasswordRepeat:“密码”
};
expect($scope.isSubmitable()).toBeTruthy();

>>>$scope.changePassword();不知道它是否相关,但为什么你在监视
mockSession.getCurrentSession
而不是
callThrough
时要
callFake
?实际上,这让我的测试运行起来了。这是我同事的临时建议,我忘了纠正。非常感谢!不知道它是否相关,但你为什么
callFake
在监视
mockSession.getCurrentSession
而不是
callThrough
时?实际上,这让我的测试运行了。这是我同事的临时建议,我忘记了纠正。非常感谢!