Jasmine测试控制器从错误的ui-router状态

时间:2016-10-18 18:50:48

标签: angularjs angular-ui-router jasmine

我有一个页面,一切正常。但是,在测试所述控制器的代码之后,我对该页面的控制器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,因为newedit状态共享大部分相同的功能。

当我转到页面的地址<host>/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

前两个是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,因为该测试还会在控制台日志中打印“这里”字样。

我无法弄清楚为什么测试似乎没有停止并开始测试RootCtrl状态的root。它可能与状态fee-rule是抽象的事实有关吗?此外,还定义了NewCtrl,但它是空的。

1 个答案:

答案 0 :(得分:0)

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