Тестирование Jasmine JQuery не распознает тег p как скрытый

Я пытаюсь использовать Jasmine и Jasmine-JQuery для проверки кода, над которым я работаю. Тем не менее, я написал простой тест, чтобы увидеть, если click слушатель срабатывает. Я следовал руководству, показывающему, как настроить шпионов и использовать их, чтобы увидеть, были ли инициированы события. Хотя это работает нормально, когда я добавил Jasmine-JQuery Matcher toBeHidden() он продолжает возвращать ложь. Я протестировал метод, нажав на кнопку, которая запускает событие, выбрав его и вызвав click() в теме. Я также пытался положить его в setTimeOut обратный вызов, чтобы убедиться, что событие было запущено, но оно также не работает.

Вот мой слушатель

$("#b1").click(function(){
    $("#p1").hide();
});

Вот мой тест

describe("Hide, Show, Toggle Tests", function() {
  var spyEvent;
  function setUpToggleFixture() {
    setFixtures('<div class="container">'
            + '<button id="b1">Hide Paragraph</button> <button id="b2">Show Paragraph</button> <button id="b3">Toggle Paragraph</button>'
            + '<p id="p1">Lorem</p></div>');    
  }

  beforeEach(function() {
    setUpToggleFixture();
  });

  it ("should invoke the hide click event.", function() {
    spyEvent = spyOnEvent('#b1', 'click');
    $('#b1').click());

    expect('click').toHaveBeenTriggeredOn('#b1');
    expect(spyEvent).toHaveBeenTriggered();
    expect($("#p1")).toBeHidden();
  });
});

1 ответ

Если у кого-то еще есть проблемы с тестированием JQuery с Jasmine, имейте в виду, что оборачивая любой код в $(document).ready(function(){ }); это предотвратит его тестирование Жасмином. Мое решение заключалось в том, чтобы обернуть мой селектор в выражение функции JS и вызвать эту функцию в $(document).ready(function(){ }); вот так,

//my js file
$(document).ready(function(){ 
  hide();
});

function hide(){
  $("#b1").click(function(){
    $("#p1").hide();
  });
}

И проверить это так

beforeEach(function() {
  setFixtures('<div class="container">'
            + '<button id="b1">Hide Paragraph</button> <button id="b2">Show Paragraph</button> <button id="b3">Toggle Paragraph</button>'
            + '<p id="p1">Lorem</p></div>');
});

it ("should hide the paragraph.", function() {
  hide();   //I need to call the method before running it now that I wrapped my 
           //method in a function expression
  $('#b1').click();

  expect($("#p1")).toBeHidden();
});
Другие вопросы по тегам