Невозможно вызвать событие для элемента в js-fixture с Karma и Mocha

Я использую js-fixture, Mocha, Chai, Sinon с кармой.

Я могу видеть правильный элемент в обертке.

Однако, когда я запускаю событие click, событие click никогда не срабатывает.

Я предполагаю, что событие никогда не привязывается к элементу.

Я что-то не так с приборами? Есть ли лучший способ для тестирования событий jQuery с мокко?

Тестовое задание:

var thisFixture,
    wrapper;
describe("modal is removed when close button is clicked", function () {
    beforeEach(function () {
        fixtures.path = "/base/spec/javascripts/fixtures";
        fixtures.load('modal.html');
        thisFixture = $(fixtures.body());
        wrapper = $(thisFixture[0]);
    });
    it("should is removed from the dom", function () {
        debugger;

        h2uModal.bindEvents();
        var close = wrapper.find(".fa-times");
        expect(wrapper.size()).to.equal(1);
        close.trigger("click");
        expect(wrapper.size()).to.equal(0);
    });
    afterEach(function () {
        fixtures.cleanUp();
    });
});

Тестируемый код:

var h2uModal = {
    bindEvents: function () {
        $("#modal .fa-times").click(function () {
            $(this).parents("#wrapper").remove();
        });
    }
};

Крепеж:

<div id='wrapper'>
    <div id='modal'>
        <i class='fa-times'></i>
    </div>
</div>

Результат:

Chrome 34.0.1847 (Mac OS X 10.9.2) modal is removed when close button is clicked should is removed from the dom FAILED
AssertionError: expected 1 to equal 0

1 ответ

Проблема, которую я вижу, заключается в том, как вы используете jQuery. Вы инициализированы wrapper как это:

wrapper = $(thisFixture[0]);

Затем вы нажимаете #fa-times элемент, который должен удалить элемент, который вы захватили в wrapper из DOM. Перед кликом вы проверяете это:

expect(wrapper.size()).to.equal(1);

Пока все хорошо, но после клика, который удалит его, вы проверяете это:

expect(wrapper.size()).to.equal(0);

Это не может работать. Это будет работать, если удаление элемента из DOM каким-либо образом обновит jQuery объекты, которые содержат его, но теперь это как jQuery работает. Если я возьму дюжину элементов абзаца с:

var $foo = $('p');

и делать $foo.remove(), размер $foo не изменится. Единственная разница между до и после состоит в том, что элементы DOM, которые были выбраны $foo были с родительским узлом до удаления и без родительского узла после удаления.

Таким образом, вы можете обновить свой код, чтобы проверить, что wrapper[0].parentNode не является null до щелчка и null после.

Кстати, size() Метод не рекомендуется с jQuery 1.8, вы должны использовать wrapper.length если вы хотите проверить его размер (в другом тесте).

Другие вопросы по тегам