【问题标题】:AngularJS Jasmine - How to Test Return Value of a Directive's Link FunctionAngularJS Jasmine - 如何测试指令链接函数的返回值
【发布时间】:2016-03-25 06:56:15
【问题描述】:

我有一个看起来像这样的指令:

myApp.directive('inputCheck', function(){
    return{
        restrict: 'A',
        link: function(scope, element){
            element.keydown(function(event){
                return event.which == 46
            });
        }
    }
});

上面检查用户是否点击了键盘上的delete键。我可以使用以下方法为其设置 Jasmine 单元测试:

describe('inputCheckTest', function(){
    it('should return true when delete key is pressed', function(){
        var scope = inputCheckElement.scope();
        var event = jQuery.Event('keydown');
        event.which = 46;
        inputCheckElement.trigger(event);
        // How do I check that the returned value from the link function is true?
    });
});

在这个单元测试中,你如何写一个关于返回值的真实检查?

【问题讨论】:

  • 您认为谁会从事件处理程序中获得回报?既然没人会看到,那回报有什么关系吗?

标签: angularjs jasmine


【解决方案1】:

在 Jasmine 中,您可以使用 expect(X).toBe(y); 断言真理

在您的情况下,您将返回一个布尔值以查看是否按下了 delete 按钮。要对此进行测试,您可以编写类似的内容;

 var pressedDelete = inputCheckElement.trigger(event);
 expect(pressedDelete).toBe(true); 

代码未经测试,但它应该可以帮助您了解逻辑。

【讨论】:

  • 这里的问题是 inputCheckElement 是一个 jQuery 元素,所以 trigger 只返回链接的 jQuery 并且没有结果。
【解决方案2】:

无法从链接函数中检索到提到的函数,它是一个匿名函数,在那里注册为事件处理程序。

在 Angular 中获取事件处理程序并不是一项简单或经过充分验证的任务,因为它处理的是内部对象,尤其是考虑到它不是 Angular 事件处理程序而是 jQuery 事件处理程序这一事实。

理论上,注册的事件处理程序可以通过

  var events = $.cache[inputCheckElement[0][$.expando]].events;

keydown 事件处理程序被埋在这个对象中,所以它可以被窥探。

更可靠和方便的方法是将 jQuery 参与保持在最低限度,因为它是一个应该被测试的处理程序,而不是 jQuery 事件机制。

可以在specs中编译指令之前完成,所以在调用指令链接的时候,element.keydown已经是一个间谍,原型继承自$.prototype

var keydownHandler;
jasmine.spyOn(angular.element.prototype, 'keydown').and.callFake(function (handler) {
  keydownHandler = handler;
});
var inputCheckElement = $compile('<input input-check>')(scope);
...
expect(inputCheckElement.keydown).toHaveBeenCalled();
expect(keydownHandler({ which: 46 })).toBe(true);

另一种方法是保存所有与 DOM 相关的东西以进行 E2E 测试(通常是可接受的解决方案)。编写link 单元测试规范可能会很痛苦,但它们仍然会在 E2E 中重复。

【讨论】:

    猜你喜欢
    • 2016-05-28
    • 2015-09-11
    • 1970-01-01
    • 2013-01-23
    • 2013-08-25
    • 2021-09-03
    • 1970-01-01
    • 2014-05-23
    • 2014-07-05
    相关资源
    最近更新 更多