茉莉花的流星速度没有回归期待的结果?

时间:2015-08-10 00:10:30

标签: javascript meteor jasmine velocity

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

  1. 将用户列表返回为<div>
  2. 点击按钮可将<div>的计数减少一个。
  3. 这似乎不起作用:

      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或其​​他内容?也许有些异步方法可以回调?我不确定,但似乎是一个简单的错误。

1 个答案:

答案 0 :(得分:12)

控制反应性

首先你应该了解反应和Meteor的工作原理。 管理反应性的组件称为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)
});