Подтвердить что ты не робот

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

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

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" для работы, как я ожидаю?


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

Ответ 1

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

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

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