Как проверить, что методы jQuery (fadeOut, hide и т. д.) вызывались с помощью Jasmine

Я пытаюсь очистить свой Javascript, применяя те же методы TDD, которые работают для меня в Ruby, но переход на Jasmine поставил меня в тупик.

В качестве простого примера я хотел бы указать, что данный элемент исчезает при нажатии:

$('.position-details').live 'click', ->
  $this = $(this)
  $this.fadeOut 'fast', ->
    $this.closest('.fields').find('.position-search').fadeIn('fast').focus()

Мои характеристики:

describe "Position picker", ->
  beforeEach ->
    loadFixtures("position_picker.html")
    @details = $('.position-details')
    @picker = $('.position-picker')
    jasmine.Clock.useMock()

  it "the position details are initially shown", ->
    expect(@details).toBeVisible()

  describe "when the position details are clicked", ->
    it "fades out the position details", ->
      @details.trigger('click')
      jasmine.Clock.tick(1000)
      expect(@details).not.toBeVisible()

Моя приставка:

<div id='position-data' data-positions="[{&quot;value&quot;:35,&quot;label&quot;:&quot;Accountant&quot;,&quot;division&quot;:&quot;North&quot;,&quot;job_class&quot;:&quot;Headquarters&quot;}]"></div>

<div class='position-details'>
  <div class='position-name'></div>
  <br />
</div>

<div class='position-picker'>
  <label>Position<abbr title="required">*</abbr></label>
  <span class="error" />
  <input class="position-search" type="text" />
  <div>
    <input class="position_id" type="text" />
  </div>
</div>

Первая спецификация проходит, и я не уверен, почему вторая нет. Как только я получу несколько из них под свой пояс, я уверен, что это станет второй натурой. Спасибо за любую помощь или совет!


person Blastula    schedule 27.12.2011    source источник
comment
Почему вы хотите проверить, что элемент невидим. За это отвечает не ваш код, а jquery. Поэтому, если в jquery есть ошибка, ваш тест не будет выполнен, даже если ваш код правильный. Все, что вы должны проверить, это то, что при щелчке функция вызывается для вашего элемента.   -  person Andreas Köberle    schedule 28.12.2011
comment
Спасибо за вашу помощь. Я не хочу проверять, что jquery работает, но я написал код, который вызывает fadeOut, потому что элемент должен исчезать. Я предполагаю, что семантически я проверяю это неправильно, но я не могу найти примеры того, как я должен это проверять. Мой код может вызвать fadeOut, если он все еще должен исчезать. Просто есть другой способ сделать это, который я не получаю, и это не код выше.   -  person Blastula    schedule 28.12.2011
comment
Взгляните на этот SO: stackoverflow.com/a/8526477/184883 и этот пост в блоге tinnedfruit.com/2011/04/26/   -  person Andreas Köberle    schedule 30.12.2011
comment
@AndreasKöberle, этот комментарий очень полезен. Если вы перефразируете это как ответ, я приму это. Это действительно решение.   -  person Blastula    schedule 07.01.2012


Ответы (2)


Взгляните на этот SO и на этот запись в блоге

person Andreas Köberle    schedule 07.01.2012

Вы можете использовать spyOn

Проверь это:

it("fades out the element", function() {
  spyOn($.fn, 'fadeOut');
  fadeOutElem();
  expect($.fn.fadeOut).toHaveBeenCalled();
});

Также вы можете использовать тайм-аут следующим образом:

it("fades out the element", function(done) {
  fadeOutElem();
  setTimeout(300, function() {
    expect($(".position-details").css('display').toEqual('none');
    done();
  });
});

person edymerchk    schedule 20.03.2015