使用jasmine点击事件调用如何断言间谍?

时间:2012-07-17 19:05:20

标签: javascript javascript-events jasmine jasmine-jquery

我正在编写一个简单的点击处理程序,需要传入的事件(如此)

Thing = function($){

    var MyObject = function(opts){
        this.opts = opts;
    };

    MyObject.prototype.createSomething = function(){
        var that = this;
        $('#some_dom_element').live('click', function(e) {
            that.doStuff(e);
        });
    };

    MyObject.prototype.doStuff = function(e) {
        //do some javascript stuff ...
        e.preventDefault();
    };

    return MyObject;

}(jQuery);

目前在我的jasmine规范中,我有一些东西可以监视我期望被调用的函数(但是因为它被调用e -not而没有args-我的断言失败了)

    it ("live click handler added to the dom element", function(){
        var doSpy = spyOn(sut, 'doStuff');
        sut.createSomething();
        $("#some_dom_element").trigger('click');
        expect(doSpy).toHaveBeenCalledWith();
    });

我如何纠正这个“toHaveBeenCalledWith”按照我的预期工作?


更新

我无法按原样获得接受的答案,但我能够稍微改变一下,以下是我100%的工作实例

    it ("should prevent default on click", function(){
        var event = {
            type: 'click',
            preventDefault: function () {}
        };
        var preventDefaultSpy = spyOn(event, 'preventDefault');
        sut.createSomething();
        $("#some_dom_element").trigger(event);
        expect(preventDefaultSpy).toHaveBeenCalledWith();
    });

2 个答案:

答案 0 :(得分:13)

您必须触发自己的事件传递stopPropagation方法的间谍,因为您想测试事件是否已停止。

var event = {
    type: 'click',
    stopPropagation: function(){}
}
var spy = spyOn(event, 'stopPropagation');
$('#some_dom_element').trigger(event);
expect(spy).toHaveBeenCalled();

注意:当您监视要测试的对象时会出现代码异味,因为您开始测试类的内部行为。把你的功能想象成一个黑盒子,只测试你投入的东西并离开。在您的情况下,重命名函数将破坏测试,而代码仍然有效。

答案 1 :(得分:0)

如果您不能使用jQuery,则可以使用dispatchEvent并检查其返回值(基于this answer)。

const domElem = document.getElementById('some_dom_element');
const clickEvent = new MouseEvent('click', {
  view: window,
  bubbles: true,
  cancelable: true
});

const cancelled = !domElem.dispatchEvent(clickEvent);
expect(cancelled).toBeTruthy();