Приборы QUnit не восстанавливаются каждый раз

Я новичок в QUnit и пытаюсь понять, как #qunit-fixtures восстанавливаются. Насколько я понимаю, все в этом элементе сбрасывается перед запуском нового теста. Однако я вижу (что для меня) что-то странное. В приведенном ниже примере в приборе есть form, который состоит только из элемента input и div с классом has-error. Насколько я понимаю, перед запуском каждого теста они должны быть восстановлены в исходное состояние. Я указал обработчик события keypress для $('input'), чтобы просто скрыть div в приборе.

У меня есть два теста, которые делают одно и то же: вызывают keypress на входе и утверждают, что текст ошибки скрыт.

Что я вижу, так это то, что проходит только один первый. Может ли кто-нибудь объяснить мне такое поведение?

<html>
  <head>
    <link rel="stylesheet" href="qunit-1.18.0.css">
  </head>

  <body>
    <div id="qunit"></div>
    <div id="qunit-fixture">
      <form> 
        <input name="text" />
        <div class="has-error">Error text</div>
      </form>
    </div>

    <script src="http://code.jquery.com/jquery.min.js"></script>
    <script src="qunit-1.18.0.js"></script>
    <script>
      QUnit.config.reorder = false;
      QUnit.test( "test 1", function ( assert ) {
        $('#qunit-fixture').find('input').trigger('keypress');
        assert.equal($('#qunit-fixture').find('.has-error').is(':visible'), false);
      });

      QUnit.test( "test 2", function ( assert ) {
        $('#qunit-fixture').find('input').trigger('keypress');
        assert.equal($('#qunit-fixture').find('.has-error').is(':visible'), false);
      });

      $(document).ready(function () {
        $('#qunit-fixture').find('input').keypress(function() {
          $('#qunit-fixture').find('.has-error').hide();
        });
      });

    </script>

  </body>
</html>

Цель теста — проверить событие keypress. Независимо от того, какой код QUnit воздействует на фикстуру, поскольку это фикстура, если первый тест выполняется $('#qunit-fixture').find('.has-error').hide();, не следует ли отменить это действие до запуска второго теста?


person VMrx    schedule 26.05.2015    source источник
comment
Кажется маловероятным тестовый сценарий, проводить тесты на самом приборе. Предложение: попробуйте другие более типичные тесты.   -  person Norman Cousineau    schedule 27.05.2015
comment
Я вижу это как тесты обработчиков событий, а не приборов...   -  person VMrx    schedule 27.05.2015
comment
По умолчанию QUnit изменит порядок тестов. Чтобы сохранить порядок, сделайте это QUnit.config.reorder = false; Так что в вашем случае это всегда второй тест RUN, который терпит неудачу. Чтобы получить полный ответ на этот вопрос, вы можете объяснить, почему вы делаете этот тест, потому что это кажется странным... выполнять тест на части прибора, не зная, какой другой код qunit может воздействовать на него.   -  person Norman Cousineau    schedule 27.05.2015
comment
Спасибо. Это действительно полезно. Итак, теперь я понимаю, почему неудачный тест чередовался между двумя. Я отредактировал вопрос, чтобы уточнить, что я тестирую обработчик событий. Может быть, я просто не понимаю, что такое фикстура, но я думал, что это что-то, что восстанавливается в исходное состояние перед запуском каждого теста.   -  person VMrx    schedule 27.05.2015
comment
Это приспособление предназначено только для использования QUnit, оно не предназначено для наших тестов.   -  person Norman Cousineau    schedule 27.05.2015
comment
Но даже собственное вступление QUnit example предполагает прикосновение к тому, что находится в $('#qunit-fixture'). Если приспособление не предназначено для прикосновения, для чего именно оно предназначено?   -  person VMrx    schedule 27.05.2015
comment
Я это проверял, не знал. Поместив его в элемент #qunit-fixture, нам не нужно беспокоиться о том, что изменения DOM из одного теста повлияют на другие тесты, потому что QUnit автоматически сбрасывает разметку после каждого теста.   -  person Norman Cousineau    schedule 27.05.2015


Ответы (1)


Я думаю, что QUnit удаляет элемент, который вы добавили в фикстуру, перед запуском каждого теста. Таким образом, обработчик события «нажатие клавиши», добавленный к готовому документу, удаляется к моменту начала второго теста. Это будет работать, если вы добавите обработчик событий в начале каждого теста или в готовом документе следующим образом:

$("body").on("keypress","input",function( event ) {
        $('.has-error').hide();
});

QUnit может не удалить его для первого теста, что объясняет, почему он работает в первый раз.

person Norman Cousineau    schedule 27.05.2015
comment
Большое спасибо. Я только что понял это! - person VMrx; 27.05.2015