Подтвердить что ты не робот

Скорость метеорита с Жасмином не возвращается, ожидая результата?

Я пытаюсь проверить следующее, которое работает вручную:

  • Возвращает список пользователей как <div>
  • Нажмите кнопку, чтобы уменьшить количество <div> на единицу.

Это не работает:

  it("should show one less person if you tap you liked them", function() {
    var personLength = $('.person').length;
    console.log(personLength); #> 7
    $("[data-action=like]").first().click();
    console.log($('.person').length); #> 7
    console.log(Likes.find().fetch()); #> 1
    expect($('.person').length).toEqual(person-1); #> Fail (expected 7 to equal 6)
  });

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

Я думаю, что я пропустил какой-то способ reset, чтобы проверить, чтобы снова посмотреть DOM или что-то еще? Возможно, какой-то асинхронный метод для обратного вызова? Я не уверен, но кажется простой ошибкой.

4b9b3361

Ответ 1

Поддержание реактивности под контролем

Сначала вы должны понять, как работает реактивность и Метеор. Компонент, который управляет реактивностью, называется Tracker (ранее Deps). Вы можете прочитать, как это работает в Руководство по метеорологии.

Каждый раз, когда вы вызываете действие, которое вызовет реактивное поведение и вы хотите проверить результат реактивного поведения, вы должны вызовите Tracker.flush() после запуска действия. Это обеспечит все реактивные изменения применяются до того, как вы оцениваете свои ожидания.

Когда требуется вызов Tracker.flush()? (неполный список)?

  • После создания шаблонов с Blaze.render и Blaze.renderWithData
  • После запуска событий DOM
  • После изменения данных в коллекциях

Если ваши ожидания потерпят неудачу, и вы проверили вручную, что проверенные поведение работает, вы можете попытаться вставить Tracker.flush до своих ожиданий.

Для вашего примера это должно сделать это:

beforeAll(function () {
  var self = this;

  self.deferAfterFlush = function (callback) {
    Tracker.afterFlush(function () {
      Meteor.defer(callback);
    });
  };
});

// Guarantee that tests don't run in a ongoing flush cycle.
beforeEach(function (done) {
  this.deferAfterFlush(done);
});

it("should show one less person if you tap you liked them", function() {
  var personLength = $('.person').length;
  console.log(personLength); #> 7
  $("[data-action=like]").first().click();
  Tracker.flush();
  console.log($('.person').length); #> 6
  console.log(Likes.find().fetch()); #> 1
  expect($('.person').length).toEqual(person-1); #> Pass (expected 6 to equal 6)
});