Как утверждать, что шпион вызывается событием при щелчке с помощью жасмина?

Я пишу простой обработчик кликов, и мне нужно передать событие (например, так)

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, а не без аргументов, мое утверждение не работает)

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

person Toran Billups    schedule 17.07.2012    source источник


Ответы (2)


Вы должны инициировать собственное событие, передав шпион для метода stopPropagation, потому что вы хотите проверить, было ли событие остановлено.

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

Примечание: когда вы шпионите за объектом, который хотите протестировать, чувствуется запах кода, потому что вы начинаете тестировать внутреннее поведение вашего класса. Думайте о своей функции как о черном ящике и проверяйте только то, что вы вставляете и вынимаете. В вашем случае переименование функции в нарушит тест, пока код все еще действителен.

person Andreas Köberle    schedule 18.07.2012
comment
как утверждать пользовательские события в жасмине? например, если имя события создано, значит, как мы можем это утверждать. - person Parthi; 25.07.2018

Если вы не можете использовать jQuery, вы можете использовать dispatchEvent и проверить его возвращаемое значение (на основе этого ответа).

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();
person Katja    schedule 08.11.2019