如何认定一个间谍被调用,使用茉莉花点击事件?(How to assert a spy is invo

2019-07-30 11:51发布

我正在写一个简单的点击处理程序,并需要传递的事件(像这样)

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);

目前在我的茉莉花规范我已经得到的东西来窥探我所期望的功能被调用(但因为它是所谓的随e - 不是没有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”如我所料工作?


UPDATE

我无法接受的答案为就是工作,但我能够改变它只是一点点,下面是我的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();
    });

Answer 1:

你必须触发自己的事件传递一个间谍的stopPropagation方法,因为你想测试,如果该事件被停止。

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

注:有代码味道,当你窥视你想测试的对象,因为你开始测试类的内部行为。 想想你的功能一个黑盒子和测试只有你把和摆脱的东西。 在你的情况下,重命名的功能将打破测试,而代码仍然有效。



文章来源: How to assert a spy is invoked with event on click using jasmine?