Ответ 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)
});