我的指令看起来像:
{
"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
如何在此单元测试中对返回值进行真正的检查?
答案 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中重复出现。