我正在尝试测试以下手动工作:
<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)
});
我很困惑为什么会这样做。手动测试时,我明显得到了预期的结果。
我想我错过了某种方法来重置该测试以再次查看DOM或其他内容?也许有些异步方法可以回调?我不确定,但似乎是一个简单的错误。
答案 0 :(得分:12)
首先你应该了解反应和Meteor的工作原理。 管理反应性的组件称为Tracker(以前称为Deps)。 您可以在Meteor Manual中了解它的工作原理。
每次触发一个会导致反应行为的动作
你想要测试反应行为的结果
触发操作后调用Tracker.flush()
。这将确保这一点
在评估您的期望之前,应用所有被动变更。
何时需要Tracker.flush()
来电? (不完整清单)?
Blaze.render
和Blaze.renderWithData
如果您的期望失败并且您已经手动验证了测试结果
行为有效,您可以尝试在预期之前插入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)
});