单元测试控制器中的$ http解析

时间:2015-06-30 03:52:59

标签: javascript angularjs unit-testing karma-jasmine angular-ui-router

我的控制器测试需要帮助。我有一个resolve使用ui-router。在我的测试中,我需要弄清楚如何处理resolve exampleData

config.js

angular.module('myModule')
  .config(['$stateProvider', '$urlRouterProvider',

    function($stateProvider, $urlRouterProvider) {

      $stateProvider
        .state('site', {
          abstract: true,
          resolve: {
            exampleData: function(ExampleService) {
              // ExampleService.get() makes an $http call
              return ExampleService.get();
            }
          },
          // etc
        })
        .state('example', {
          parent: 'site',
          url:'/example',
          controller: 'ExampleCtrl as example',
          templateProvider: function($templateCache) {
            return $templateCache.get('views/example.html');
          }
        });

    }]);

示例-controller.js

angular.module('myModule')
  .controller('ExampleCtrl', ['exampleData',
     function(exampleData) {

       var self = this;
       self.exampleData = exampleData;

       // self.exampleData should output something like
       // [
       //   {id: 1, title:'something'},
       //   {id: 2, title:'something'},
       //   {id: 3, title:'something'}
       // ]

  }]);

示例-controller.test.js

   describe('Controller: ExampleCtrl', function() {
      beforeEach(module('myModule'));

      var ctrl;

      beforeEach(inject(function($controller) {
        ctrl = $controller('ExampleCtrl');
      }));

      describe('initialization', function() {
        beforeEach(function() {});

        it('should exist', function() {
          expect(!!ctrl).toBe(true);
        });

        it('should ...', function() {
          // do something
        });
      });

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

Unknown provider: exampleDataProvider <- exampleData <- ExampleCtrl

我的问题是:如何测试resolve中的ExampleCtrl,我该怎么办? ExampleService.get()是一个服务,它会调用$http并返回对象数组。

2 个答案:

答案 0 :(得分:0)

ERROR 1170 (42000): BLOB/TEXT column 'name' used in key specification without a key length 的{​​{1}}方法测试不是您想要做的。它是角度的一部分,它有适当的测试。

您应该在测试中关注的是您的应用程序的逻辑。应该有一个部分用于测试resolve$state返回一个承诺,ExampleService发出一个http请求等)并测试get,这应该确保控制器进程数据正常。但解决依赖关系不是应该测试的。

在这种情况下,imo应该是解决方案的替代get为了测试而解决。

ExampleCtrl

答案 1 :(得分:0)

您需要手动实例化示例数据。我遇到了同样的问题,所以我使用此方法来解决它。对你也会很好。

 describe('Controller: ExampleCtrl', function() {
      beforeEach(module('myModule'));

      var ctrl,exampleData;

      beforeEach(inject(function($controller,ExampleService) {
        exampleData = ExampleService.get();
        ctrl = $controller('ExampleCtrl',{exampleData});
      }));

      describe('initialization', function() {
        beforeEach(function() {});

        it('should exist', function() {
          expect(!!ctrl).toBe(true);
        });

        it('should ...', function() {
          // do something
        });
      });