2015-02-25 2 views
0

Я пытаюсь понять, как выполнить модульное тестирование моей директивы в моей ситуации ниже.Единичное тестирование директивы - Невозможно заставить поддельные данные

В основном я пытаюсь выполнить проверку на соответствие директиве с контроллером. При загрузке этой директивы контроллер делает HTTP-запрос службой, которая снова возвращает некоторые данные контроллеру, затем предоставляет эти данные в представлении директивы.

В сценарии ниже в моем понимании я должен делать:

  • A $ httpBackend, чтобы избежать исключения, когда запрос HTTP делается;
  • занесения фальшивых данных, чтобы иметь возможность модульного тестирование директивы с диффом поведением
  • Компиляцией директивы

То, что я пытался до сих пор, как вы можете видеть, это переопределить службу с поддельные данные. То, что я не мог сделать до сих пор.

Возникают некоторые сомнения.

Как вы можете видеть в моем контроллере. Я предоставляю весь сервис на представление:

$ scope.ItemsDataservice = ItemsDataservice;

Что заставляет меня думать, что мой подход к переопределению службы должен работать.

Мой вопрос:

В сценарии ниже я понимаю, что я мог бы отменить службу для управления данными или даже переопределить контроллер для управления данными по охвату.

Что здесь делать? Я понимаю неправильно? Я смешиваю модульные тесты?

В моем текущем коде модульного тестирования, когда я применяю поддельные данные (или нет), не имеет никакого значения:

ItemsDataservice .items = DATARESULT;

ItemsDataservice.items = null;

Контроллер:

angular.module('app') 
    .controller('ItemsCtrl', function ($scope, $log, ItemsDataservice) { 

     $scope.ItemsDataservice = ItemsDataservice; 
     $scope.ItemsDataservice.items = null; 

     $scope.loadItems = function() { 

      var items = []; 

      ItemsDataservice.getItems().then(function(resp) { 

       if (resp.success != 'false') { 

        for (resp.something ...) { 
         items.push({ ... }); 
        }; 

        ItemsDataservice.items = items; 

       }; 

      }, function(e) { 
       $log.error('Error', e); 
      }); 
     }; 

     $scope.loadItems(); 

    }); 

Сервис:

angular.module('app') 
    .service('ItemsDataservice', function ItemsDataservice($q, $http) { 

     ItemsDataservice.getItems = function() { 

      var d = $q.defer(); 
      var deffered = $q.defer(); 
      var url = 'http://some-url?someparameters=xxx' 

      $http.get(url) 
       .success(function (d) { 
        deffered.resolve(d); 
       }); 

      return deffered.promise; 

     }; 

     return ItemsDataservice; 

    }); 

Директива:

angular.module('app') 
    .directive('items', function() { 
     return { 
      templateUrl: '/items.html', 
      restrict: 'A', 
      replace: true, 
      controller: 'ItemsCtrl' 
     }; 
    }); 

директива Юнит:

ddescribe('Directive: Items', function() { 

    var element, scope, _ItemsDataservice_, requestHandler, httpBackend; 
    var URL = 'http://some-url?someparameters=xxx'; 
    var DATARESULT = [{ ... }]; 

    // load the directive's module 
    beforeEach(module('app')); 
    beforeEach(module('Templates')); // setup in karma to get template from .html 

    beforeEach(inject(function ($rootScope, ItemsDataservice) { 

    httpBackend = $httpBackend; 
    scope = $rootScope.$new(); 
    _ItemsDataservice_ = ItemsDataservice; 

    requestHandler = httpBackend.when('GET', URL).respond(200, 'ok'); 

    })); 

    afterEach(function() { 
    //httpBackend.verifyNoOutstandingExpectation(); 
    //httpBackend.verifyNoOutstandingRequest(); 
    }); 

    it('Show "No Items available" when empty result', inject(function ($compile) { 

    _ItemsDataservice_.items = null; 

    element = angular.element('<div data-items></div>'); 
    element = $compile(element)(scope); 
    scope.$digest(); 

    element = $(element); 
    expect(element.find('.msg_noresult').length).toBe(1); 

    })); 

    it('Should not show "No Items available" when data available ', inject(function ($compile) { 

    _ItemsDataservice_.items = DATARESULT; 

    element = angular.element('<div data-items></div>'); 
    element = $compile(element)(scope); 
    scope.$digest(); 

    element = $(element); 
    expect(element.find('.msg_noresult').length).toBe(0); 

    })); 

}); 
+0

Является ли мое сомнение понятным? – Ventura

ответ

0

Я выяснял проблему.

изменил эту строку:

элемент = $ компиляции (элемент) (объем);

К этой линии:

элемента = $ компиляции (element.contents()) (масштаб);

Единственная разница это метод Jquery .contents()

Я еще не понимаю, почему. Но он решил.

Update:

Другая вещь, которую я только что обнаружил, и это было очень полезно для меня. Вы можете использовать регулярные выражения на вас httpBackend:

httpBackend.whenGET(/.*NameOfThePageXXX\.aspx.*/).respond(200, 'ok'); 

Таким образом, вам не нужно беспокоиться, чтобы использовать одни и те же параметры и т.д., если вы просто хотите, чтобы избежать исключения.