茉莉花的流星速度没有返回预期结果?
Meteor Velocity with Jasmine not returning expecting result?
我正在尝试测试以下手动工作的项目:
- Return 用户列表
<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 或其他什么?也许一些异步回调方法?我不确定,但似乎是一个简单的错误。
控制反应性
首先你应该了解反应性和流星是如何工作的。
管理反应性的组件称为 Tracker(以前称为 Deps)。
您可以在 Meteor Manual.
中阅读它的工作原理
每次你触发一个会导致反应性行为和
你想测试反应行为的结果,你应该
触发动作后调用 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)
});
我正在尝试测试以下手动工作的项目:
- Return 用户列表
<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 或其他什么?也许一些异步回调方法?我不确定,但似乎是一个简单的错误。
控制反应性
首先你应该了解反应性和流星是如何工作的。 管理反应性的组件称为 Tracker(以前称为 Deps)。 您可以在 Meteor Manual.
中阅读它的工作原理每次你触发一个会导致反应性行为和
你想测试反应行为的结果,你应该
触发动作后调用 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)
});