Я пытаюсь понять, как выполнить модульное тестирование моей директивы в моей ситуации ниже.Единичное тестирование директивы - Невозможно заставить поддельные данные
В основном я пытаюсь выполнить проверку на соответствие директиве с контроллером. При загрузке этой директивы контроллер делает 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);
}));
});
Является ли мое сомнение понятным? – Ventura