2017-02-22 76 views
0

Я пытаюсь протестировать простые манипуляции с DOM и столкнуться с некоторыми проблемами. Представьте себе следующее простое событие щелчка:Утилизация текстовых манипуляций в DOM с использованием jQuery

$('.js-click-me').on('click', function(e) { 
    e.preventDefault(); 

    $('.some-span').text('changed text'); 
}); 

Теперь же представьте, что мой HTML содержит следующее:

<span class="some-span">Original Text</span> 
<button class="js-click-me">Click Me</button> 

Хорошо, так что теперь у меня есть блок тестирует

describe('text change test', function() { 
    it('The text of .some-span should change when button is clicked', function() { 
    assert.equal('Original Text', $('.some-span').text()); 
    $('.js-click-me').click(); 
    assert.equal('changed text', $('.some-span').text()); 
    }); 
}); 

Я ожидаю, что первое утверждение будет проходить, потому что исходный текст, по сути, «Исходный текст» (это делается только для установки базовой линии и, возможно, не требуется).

Второе утверждение, которое я ожидаю пройти, потому что после щелчка он меняет текст с «Исходный текст» на «измененный текст». Однако, когда я запускаю такие тесты, второе утверждение терпит неудачу, потому что тест запускает сразу после и DOM еще не обновил текст.

Я могу добавить второе испытание в обертку setTimeout, но это не кажется правильным или эффективным.

Любые советы по этому вопросу?

+0

Я хочу отметить, что «щелчок» - это просто простой пример. Я хочу проверить все возможные способы изменения текста, включая часть вызываемой функции. –

+0

Событие, вызванное вызовом '$ (..). Click()' обрабатывается синхронно. Вы проверили ручную проверку того, что ваш DOM на самом деле был изменен, но ваш тест просто не подбирает его? – Louis

+0

Да. Это не всегда событие щелчка, которое я использую для запуска этого изменения DOM. Если я предупрежу о текстовом значении, это будет правильно. Я думаю, что те, которые не используют .find() и .children(), более эффективны, поэтому они меняются без задержки, а те, которые требуют тайм-аута. –

ответ

0

использование. затем функция. Как показано ниже, код

describe('text change test', function() { 
    it('The text of .some-span should change when button is clicked', function() { 
    assert.equal('Original Text', $('.some-span').text()); 
    $('.js-click-me').click().then(function(){ 
     assert.equal('changed text', $('.some-span').text()); 
    });  
    }); 
}); 
+0

.then() работает только для функций, которые возвращают обещание, и я не думаю, что щелчок делает. Однако может быть неправильно. –