【问题标题】:Jasmine testing controller from wrong ui-router state来自错误 ui-router 状态的 Jasmine 测试控制器
【发布时间】:2016-10-19 03:09:35
【问题描述】:

我有一个一切正常的页面。然而,我对这个页面的控制器FeeRuleCtrl 的测试,在它测试了所述控制器的代码之后,继续并开始测试不同状态的控制器。这是我的 app.js:

$stateProvider
  .state('root', {
    url: "/",
    templateUrl: "<%= Rails.application.routes.url_helpers.client_side_path('admin/fee_suites/root') %>",
    controller: 'RootCtrl',
    resolve: {
      feeSuites: function(FeeSuiteCrud, FeeSuite){
        console.log('here');
        var feeCrud = new FeeSuiteCrud(FeeSuite);
        var promise = feeCrud.query();

        return promise.then(function(response){
          return response;
        });
      }
    }
  })
  .state('fee-rule', {
    abstract: true,
    controller: 'FeeRuleCtrl',
    template: "<ui-view/>",
    resolve: {
      feeTypes: function(FeeSuiteCrud, FeeType){
        var feeCrud = new FeeSuiteCrud(FeeType)
        var promise = feeCrud.query();

        return promise.then(function(response){
          return response;
        })
      },
      feeSuites: function(FeeSuiteCrud, FeeSuite){
        var feeCrud = new FeeSuiteCrud(FeeSuite);
        var promise = feeCrud.query();

        return promise.then(function(response){
          return response;
        });
      }
    }
  })
  .state('fee-rule.new', {
    url: '/new',
    controller: 'NewCtrl',
    templateUrl: "<%= Rails.application.routes.url_helpers.client_side_path('admin/fee_suites/feeRule.html') %>",
    data: { title: 'Add a New Fee Rule' }
  })
  .state('fee-rule.edit', {
    url: "/edit/:id",
    controller: 'EditCtrl',
    templateUrl: "<%= Rails.application.routes.url_helpers.client_side_path('admin/fee_suites/feeRule.html') %>",
    data: { title: 'Edit Fee Rule' },
    resolve: {
      feeRule: function(FeeSuiteCrud, FeeRule, $stateParams){
        var feeCrud = new FeeSuiteCrud(FeeRule);
        var promise = feeCrud.get($stateParams.id)

        return promise.then(function(response){
          return response;
        });
      }
    }
  });

我有一个抽象状态fee-rule,因为new 和edit 状态共享大部分相同的功能。

当我转到页面地址 &lt;host&gt;/admin/fee_suites/new 时,我检查了网络选项卡,并且有 4 个服务器调用:

api/v3/fee_types
api/v3/fee_suites
api/v3/fee_suites/8?association=fee_rules
api/v3/fee_types/9?association=fee_parameters

前 2 个在 fee-rule 状态下解析。我在测试中这样处理:

beforeEach(function(){
  module(function($provide){
    $provide.factory('feeSuites', function(FeeSuite){
      feeSuite = new FeeSuite({
        id: 8,
        site_id: 9,
        active: true
      });

      return [feeSuite];
    });

    $provide.factory('feeTypes', function(FeeType){
      feeType = new FeeType({
        id: 9,
        name: 'Carrier Quotes',
        value: 'carrier_quotes'
      });

      return [feeType];
    });
  });

  inject(function($injector){
    $rootScope = $injector.get('$rootScope');
    $controller = $injector.get('$controller');
    $httpBackend = $injector.get('$httpBackend');
    scope = $rootScope.$new();

    $controller("FeeRuleCtrl", {
      '$scope': scope
    });
  });
});

最后 2 个服务器调用是在 FeeRuleCtrl 内进行的。我像这样测试它们:

beforeEach(function(){
  var JSONResponse = {"master":[{"id":29,"fee_suite_id":8,"fee_parameter_id":1,"name":"American Express Fee","multiplier":0.045,"addend":0.0,"order":1,"order_readonly":true,"created_at":"2016-10-17T14:20:08.000-05:00","updated_at":"2016-10-17T14:20:08.000-05:00"},{"id":30,"fee_suite_id":8,"fee_parameter_id":2,"name":"Discover Fee","multiplier":0.045,"addend":0.0,"order":1,"order_readonly":true,"created_at":"2016-10-17T14:20:08.000-05:00","updated_at":"2016-10-17T14:20:08.000-05:00"},{"id":31,"fee_suite_id":8,"fee_parameter_id":3,"name":"MasterCard Fee","multiplier":0.045,"addend":0.0,"order":1,"order_readonly":true,"created_at":"2016-10-17T14:20:08.000-05:00","updated_at":"2016-10-17T14:20:08.000-05:00"},{"id":32,"fee_suite_id":8,"fee_parameter_id":4,"name":"Visa Fee","multiplier":0.045,"addend":0.0,"order":1,"order_readonly":true,"created_at":"2016-10-17T14:20:08.000-05:00","updated_at":"2016-10-17T14:20:08.000-05:00"}]};

  $httpBackend.expectGET('/api/v3/fee_suites/8?association=fee_rules').respond(JSONResponse);

  JSONResponse = {"master":[{"id":25,"fee_type_id":9,"name":"UPS Published Quote","value":"ups_published_quote","parameter_type":"currency","created_at":"2016-10-17T14:20:08.000-05:00","updated_at":"2016-10-17T14:20:08.000-05:00"},{"id":26,"fee_type_id":9,"name":"FedEx Published Quote","value":"fedex_published_quote","parameter_type":"currency","created_at":"2016-10-17T14:20:08.000-05:00","updated_at":"2016-10-17T14:20:08.000-05:00"},{"id":27,"fee_type_id":9,"name":"UPS Negotiated Quote","value":"ups_negotiated_quote","parameter_type":"currency","created_at":"2016-10-17T14:20:08.000-05:00","updated_at":"2016-10-17T14:20:08.000-05:00"},{"id":28,"fee_type_id":9,"name":"FedEx Negotiated Quote","value":"fedex_negotiated_quote","parameter_type":"currency","created_at":"2016-10-17T14:20:08.000-05:00","updated_at":"2016-10-17T14:20:08.000-05:00"}]};

  $httpBackend.expectGET('/api/v3/fee_types/9?association=fee_parameters').respond(JSONResponse);

  $httpBackend.flush();
});

it('should set currentFeeRuleNum', function(){
  expect(scope.FeeSuite.currentFeeRuleNum).toEqual(4);
});

当我运行测试时,出现以下错误:

Error: Unexpected request: GET /api/v3/fee_suites/

我知道它来自root 状态的解析函数feeSuites,因为测试还会在控制台日志中打印“这里”一词。

我不明白为什么测试似乎没有停止并开始在root 状态下测试RootCtrl。这可能与状态fee-rule 是抽象的事实有关吗?还定义了NewCtrl,但它是空的。

【问题讨论】:

    标签: angularjs angular-ui-router jasmine


    【解决方案1】:

    在使用不同的关键字进行更多的谷歌搜索后,在我的测试中我需要模拟 FeeRuleCtrl 中的 $state 变量。这解决了问题。

    【讨论】:

      猜你喜欢
      • 2018-07-22
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多