【问题标题】:TypeError: Cannot set property of undefined in angular scopeTypeError:无法在角度范围内设置未定义的属性
【发布时间】:2019-09-09 21:46:57
【问题描述】:

我在 Angular 1.5 版本中运行测试用例,但即使我在 postToRegisterController 控制器中有正确的逻辑并且dealerNumber 在应用程序中工作正常,我也遇到了错误。

postToRegisterController
   scope.contract.dealNumber
     × set valid deal number 
TypeError: Cannot set property 'dealNumber' of undefined
   at <Jasmine>
   at UserContext.<anonymous> (src/assets/js/controllers/portal-integrated-apps/quikRegister/postToRegisterController.spec.js:46:43)

下面是我的控制器中的一段代码。 (() => {

   describe('postToRegisterController', () => {
       let $ctrl;
       let $controller;
       let $state;
       let quikRegisterService;
       let scope;
       let $uibModalInstance;
       let $uibModal;
       let $rootScope;
       let services;

       beforeEach(module('app'));
       beforeEach(module('app.quikregister'));
       beforeEach(module('ui.bootstrap'));
       beforeEach(inject(function(_$state_, _quikRegisterService_, _$controller_,  _$rootScope_, _services_) {

           $controller = _$controller_;
           $state = _$state_;
           quikRegisterService = _quikRegisterService_;
           scope = _$rootScope_.$new();
           $rootScope = _$rootScope_;
           services = _services_;
           $uibModalInstance = jasmine.createSpyObj('$uibModalInstance', ['close', 'dismiss']);
           $uibModal = jasmine.createSpyObj('$uibModal', ['open']);

           // $uibModalInstance = $uibModalInstance;
           // $uibModal = $uibModal;
           initController();
       }));

       beforeEach(() => {
           spyOn(quikRegisterService, 'store');
          spyOn($state, 'go');
           $state.current.data = {
               breadcrumbs: [
                   'Search'
               ]
           };
           initController();
       });

       describe('scope.contract.dealNumber', function() {
           it('set valid deal number ', function() {
               scope.contract.dealNumber = 1234;
               scope.validateDealNumber();
               expect(scope.isValidDealNumber).toBe(true);
           });
       });

       function initController() {
           $ctrl = $controller('postToRegisterController', {
               quikRegisterService: quikRegisterService,
               $state: $state,
               $rootScope: $rootScope,
               $uibModalInstance: $uibModalInstance,
               $scope: scope,
               $uibModal: $uibModal
           });
           scope.$digest();
       }

   });

}) ();

我错过了什么吗?任何输入表示赞赏。请让我知道这里出了什么问题。

【问题讨论】:

    标签: jasmine angularjs-scope angular-ui-bootstrap testcase angular1.6


    【解决方案1】:

    您在 scope = _$rootScope_.$new(); 中实例化了范围变量,但您从未给 scope.contract 一个值,因此它是未定义的。

    由于scope.contract 是未定义的,那么如果您尝试为scope.contract.dealNumber 分配一个值,那么它总是会返回一个错误,指出您无法设置未定义的交易编号(在本例中为scope.contract)。

    做吧

    scope = _$rootScope_.$new();
    scope.contract={};
    

    它应该可以工作。

    【讨论】:

      【解决方案2】:

      查看您的代码,我找不到任何理由说明为什么 scope.contract 确实不应未定义。 因此,作为一种解决方法,您可以尝试

      scope.contract = {
         dealNumber = 1234
      }
      

      【讨论】:

        猜你喜欢
        • 2019-07-04
        • 2021-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-18
        • 1970-01-01
        • 2015-09-09
        • 2021-01-04
        相关资源
        最近更新 更多