我是单元测试以及 ng-animate 模块的新手。我做了一个简单的指令来测试 ng-animate。
.directive('slideShow', function ($animate, $compile) {
return {
template: '<div class="slide-show-container"></div>',
restrict: 'EA',
replace: true,
link: function (scope, element, attrs) {
var newElement = $compile('<div class="slide-show-slide"></div>')(scope);
element.bind('mouseenter',function() {
element.append(newElement);
$animate.addClass(newElement, 'slide-enter');
});
element.bind('mouseleave',function() {
$animate.removeClass(newElement, 'slide-enter');
});
}
};
});
然后我进行了以下单元测试以确认正在添加 .slide-enter 类。
it('should add slide-enter class', function () {
element.triggerHandler( "mouseenter" );
expect(element.children().hasClass("slide-enter")).toEqual(true)
});
当我在手动测试中将鼠标悬停在该指令上时,该指令正确添加了该类。但是,单元测试失败并显示未添加 slide-enter 类。
最后我想出了解决它的唯一方法是将单元测试包装在 $timeout 中:
it('should add slide-enter class', inject(function ($timeout) {
element.triggerHandler( "mouseenter" );
$timeout(function() {
expect(element.children().hasClass("slide-enter")).toEqual(true);
});
$timeout.flush();
}));
谁能帮我理解为什么测试需要这个 $timeout 才能工作?还有另一种方法可以让我搞砸的这个单元测试工作吗?