茉莉花的流星速度没有返回预期结果?

Meteor Velocity with Jasmine not returning expecting result?

我正在尝试测试以下手动工作的项目:

  1. Return 用户列表 <div>
  2. 单击按钮可将 <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)
  });

我不明白为什么会这样。手动测试时,我清楚地得到了预期的结果。

我想我缺少一些方法来重置该测试以再次查看 DOM 或其他什么?也许一些异步回调方法?我不确定,但似乎是一个简单的错误。

控制反应性

首先你应该了解反应性和流星是如何工作的。 管理反应性的组件称为 Tracker(以前称为 Deps)。 您可以在 Meteor Manual.

中阅读它的工作原理

每次你触发一个会导致反应性行为和 你想测试反应行为的结果,你应该 触发动作后调用 Tracker.flush()。这将确保 在您评估您的期望之前应用所有反应性更改。

什么时候需要 Tracker.flush() 呼叫? (不完整列表)

  • 使用 Blaze.renderBlaze.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)
});