2016-03-25 60 views
0
(function() { 
    'use strict'; 

    angular 
     .module('walletInformation') 
     .controller('WalletInformationController', WalletInformationController); 

    /* @ngInject */ 
    function WalletInformationController(
     $q, 
     $scope, 
     config, 
     logger, 
     session, 
     $interpolate, 
     flowstack, 
     profileService, 
     walletInformationFormlyService, 
     postMsg 
    ) { 
     // jshint validthis: true 
     var vm = this; 
     var app = $scope.app; 
     var user = session.get('profile').profile || {}; 

     vm.saveWalletInformation = saveWalletInformation; 
     vm.onClickCancel = onClickCancel; 
     vm.deleteWallet = deleteWallet; 
     vm.model = { 
      walletInformation : { 
       firstName: user.name.first, 
       lastName: user.name.last, 
       emailAddress: user.emailAddress, 
       phoneNumber: user.mobilePhone.phoneNumber, 
       keepMeUpdated: user.preferences.receiveEmailNotification 
      } 
     }; 

     activate(); 

     //////////////// 

     /** 
     * @function activate 
     * @description init function for the controller 
     * Calls paymentCard to get the 
     * */ 
     function activate() { 
      createFormFields(); 
      logger.info('Activated the Wallet Information View.'); 
     } 

     function createFormFields() { 
      vm.fields = walletInformationFormlyService.getFormlyFields($scope.app.text); 
     } 

     function saveWalletInformation() { 
      var updatedProfile = createLegacyProfileInformation(); 

      profileService.updateProfileInformation(updatedProfile).then(onSuccess).catch(onError); 

      function onSuccess(response) { 
       session.set('profile', { 
        profile: response.profile 
       }); 

       if (vm.model.walletInformation.currentPassword && vm.model.walletInformation.newPassword) { 
        changePasswordRequest(); 
       } else { 
        flowstack.add('accountManagement'); 
        flowstack.next(); 
       } 

      } 

      function onError(error) { 
       logger.error('Verify save Wallet Information Error: ', error); 
      } 

      //changePassword 
      function changePasswordRequest() { 
       var updatedPassword = { 
        data: { 
         currentPassword: vm.model.walletInformation.currentPassword, 
         newPassword: vm.model.walletInformation.newPassword 
        } 
       }; 

       profileService 
        .changePassword(updatedPassword) 
         .then(onChangePasswordSuccess, onChangePasswordError); 

       function onChangePasswordSuccess(response) { 
        flowstack.add('accountManagement'); 
        flowstack.next(); 
        logger.info('Change password request: ', response); 
       } 

       function onChangePasswordError(response) { 
        logger.error('Change Password Error: ', response); 
       } 
      } 

     } 

     function deleteWallet() { 
      var appText = app.text.walletInformation; 
      console.log(appText); 
      flowstack.add('confirmation'); 
      flowstack.next({ 
       data: { 
        title: appText.deleteWalletConfirmationTitle, 
        body: appText.deleteWalletConfirmationBody, 
        cancelButton: appText.deleteWalletConfirmationCancelButton, 
        confirmButton: appText.deleteWalletConfirmationConfirmButton, 
        onConfirm: function() { 
         profileService.deleteWallet().then(deleteProfileSuccess, deleteProfileFailure); 

         function deleteProfileSuccess(response) { 
          if (response.profile) { 
           logger.info('profile is successfully deleted.', response); 
           postMsg.send('closeSwitch'); 
          } 
         } 

         function deleteProfileFailure(error) { 
          logger.error('something went wrong while deleting profile.', error); 
         } 
        }, 
        onCancel: function() { 
         flowstack.add('walletInformation'); 
         flowstack.next(); 
        } 
       } 
      }); 
     } 

     function createLegacyProfileInformation() { 
      var updatedProfile = user; 
      var formlyField = vm.model.walletInformation; 

      //Update the profile 
      updatedProfile.name = { 
       first: formlyField.firstName, 
       last: formlyField.lastName 
      }; 
      updatedProfile.mobilePhone.phoneNumber = formlyField.phoneNumber; 
      updatedProfile.preferences.receiveEmailNotification = formlyField.keepMeUpdated; 

      return { 
       data: updatedProfile 
      }; 
     } 
     function onClickCancel() { 
      flowstack.back(); 
     } 
    } 
})(); 

覆蓋率是說,saveWalletInformation和的的ChangePasswordRequest的onSuccess isnt't覆蓋,但我不知道究竟是如何測試它,我現在已經測試過的唯一的事情是,saveWalletInformation函數調用配置文件服務:如何進行單元測試,然後在角控制器中進行分支。

describe.only('WalletInformationController ---', function() { 
    var controller, scope; 
    var userProfile = { 
     profile: { 
      name: { 
       first: 'someonefirstname', 
       last: 'someoneslastname' 
      }, 
      emailAddress: '[email protected]', 
      mobilePhone: { 
       countryCode: 'US+1', 
       phoneNumber: '123 212 2342' 
      }, 
      preferences: { 
       receiveEmailNotification: true 
      } 
     } 
    }; 

    beforeEach(function() { 
     bard.appModule('walletInformation'); 
     bard.inject(
      '$q', 
      '$controller', 
      '$rootScope', 
      'api', 
      'flowstack', 
      'logger', 
      'session', 
      'profileService' 
     ); 

     session.set('profile', userProfile); 
    }); 

    beforeEach(function() { 
     sandbox = sinon.sandbox.create(); 
     scope = $rootScope.$new(); 
     scope.app = { 
      text: { 
       global: {}, 
       walletInformation: { 
        deleteWalletConfirmationTitle: 'Confirm Wallet Deletion?' 
       }, 
       userInformation: { 
        emailValidation: 'Please enter valid email' 
       }, 
       signin: { 
        rememberMeLabel: 'remember me' 
       } 
      } 
     }; 

     controller = $controller('WalletInformationController', { 
      $scope: scope 
     }); 

     loggerErrorStub = sandbox.stub(logger, 'error'); 

     sandbox.stub(logger, 'info'); 

     controller = $controller('WalletInformationController', { 
      $scope: scope 
     }); 
    }); 

describe('saveWalletInformation method', function() { 
    beforeEach(function() { 
     // apiStub.restore(); 
     sandbox.stub(profileService, 'updateProfileInformation', function() { 
      return $q.when(userProfile); 
     }); 
    }); 

    it('should saveWalletInformation successfully', function() { 

     controller.saveWalletInformation(); 
     expect(profileService.updateProfileInformation).to.have.been.called; 
    }); 

    it('should log error msg when saveWalletInformation call fails', function() { 

     profileService.updateProfileInformation.restore(); 

     sandbox.stub(profileService, 'updateProfileInformation', function() { 
      return $q.reject(); 
     }); 

     controller.saveWalletInformation(); 
     scope.$apply(); 

     expect(loggerErrorStub).to.have.been.calledOnce; 
    }); 

    it('should call changePasswordRequest when currentPassword and newPassword are set', function() { 
     sandbox.stub(profileService, 'changePassword', function() { 
      return $q.when({ 
       success: true, 
       extensionPoint: null 
      }); 
     }); 

     sandbox.stub(flowstack, 'add'); 
     sandbox.stub(flowstack, 'next'); 

     controller.saveWalletInformation(); 

     // scope.$apply(); 
     // expect(flowstack.next).to.have.been.calledOnce; 
     // expect(flowstack.add).to.have.been.calledOnce; 
     expect(profileService.updateProfileInformation).to.have.been.called; 
     // expect(profileService.changePassword).to.have.been.called; 
    }); 
}); 
+0

控制器是巨大的脂肪,需要一些健身房都錯誤和成功的功能,他們不會推動'瘦控制器'的東西沒有。移動'saveWalletInformation'來分離服務,並將其與範圍和控制器分離,看起來像正確的方向。 onSuccess和onError應該是類方法,因此它們可以被窺探。它看起來更像是Code Review問題。 – estus

+0

爲什麼我看到很多人在做'var vm = this'? –

回答

0

可以讓服務調用走了一步,而不是驗證服務調用函數,你在這裏做的:

expect(profileService.updateProfileInformation).to.have.been.called; 

可以代替嘲笑從$ API調用的響應httpBackend:

httpBackend.expectGET('your/url/here').respond(200, {response object...}); 

httpBackend.expectGET('your/url/here').respond(500, {error object...}); 

然後你會被打,當你的測試運行

相關問題