AngularJS Jasmine - 如何测试指令链接函数的返回值

时间:2016-03-24 16:01:13

标签: angularjs jasmine

我的指令看起来像:

{
  "query": {
    "bool": {
      "should": [
        { query_string: { query: "ello worl", boost: 4 } },
        { query_string: { query: "ello* worl*", boost: 3, analyze_wildcard: true } },
        { query_string: { query: "*ello *worl", boost: 2, analyze_wildcard: true } },
        { query_string: { query: "*ello* *worl*", analyze_wildcard: true } } 
      ]
    }
  }
}

以上检查用户是否点击了键盘myApp.directive('inputCheck', function(){ return{ restrict: 'A', link: function(scope, element){ element.keydown(function(event){ return event.which == 46 }); } } }); 键。我可以使用以下方法为它设置我的Jasmine单元测试:

delete

如何在此单元测试中对返回值进行真正的检查?

2 个答案:

答案 0 :(得分:0)

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

来断言真相

在您的情况下,您返回一个布尔值以查看是否按下了delete按钮。为了测试这个,你可以写出类似的东西;

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

代码未经测试,但它可以帮助您使用逻辑。

答案 1 :(得分:0)

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

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

理论上,可以使用

检索已注册的事件处理程序
  var events = $.cache[inputCheckElement[0][$.expando]].events;

keydown事件处理程序隐藏在此对象中,因此可以进行间谍活动。

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

可以在规范中编译指令之前完成,因此在调用指令链接时,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中重复出现。