Ich habe eine Richtlinie, die ein Element auf der Seite mit einem Selektor klont und bewegt den Klon in eine andere Position auf der Seite:Angular + Jasmine: Wie testen Sie eine Richtlinie, die auf HTML außerhalb der Richtlinie beruht?
(function() {
'use strict';
function ctAnimatedClone($timeout) {
var directive = {
restrict: 'E',
scope: {
visible: '=',
...
},
link: function(scope, element) {
...
function cloneAndAnimateElement() {
originalElement = angular.element(scope.elementSelector).first();
clone = originalElement.clone();
originalPosition = originalElement[0].getBoundingClientRect();
clone.addClass('easeIn');
originalElement.css({ visibility: 'hidden' });
element.prepend(clone);
var baseStyles = {
opacity: 0.5,
visibility: 'visible',
position: 'absolute'
};
var styles = angular.extend(baseStyles, clonePositioning());
clone.css(styles);
$timeout(function() {
clone.css({
opacity: 1.0,
position: 'absolute',
top: scope.clonedElementPositionOffset.top,
left: scope.clonedElementPositionOffset.left,
marginLeft: '-' + (originalPosition.width/2) + 'px'
});
});
}
}
};
return directive;
}
angular
.module('crowdtap.animated-clone')
.directive('ctAnimatedClone', ctAnimatedClone);
})();
Ich versuche, es zu testen Jasmin verwenden, aber es scheitert mit : Typeerror: Cannot set property 'visible' of undefined
/* global expect */
/* global inject */
describe('animated clone directive', function() {
"use strict";
var $compile, $rootScope;
var elementHtml = "<div class='test-div'></div><ct-animated-clone visible='false' element-selector=\"'.test-div'\" cloned-element-position-offset=\"{ top: '50%', left: '50%' }\" fades-away-on-close='false' closed='false' stationary='false'></ct-animated-clone>";
//
beforeEach(function() {
module('crowdtap.animated-clone');
inject(function(_$compile_, _$rootScope_) {
$compile = _$compile_;
$rootScope = _$rootScope_;
});
});
it('moves the element when visible changes from false to true', function() {
var element = $compile(elementHtml)($rootScope);
$rootScope.$digest();
var scope = element.isolateScope();
scope.visible = true; //<------------------------------------------------
scope.$apply();
expect(element.css()).toContain("top: 10%");
});
});
Wie teste ich eine Richtlinie, die ein anderes HTML-Element erfordert auf der Seite zu sein?
Sie den Test-div Körper in before und es in afterEach löschen anhängen können. – sdfacre
hat es @sdfacre funktioniert, eine Antwort hinzugefügt – Edmund