Жасмин - работает до всех блоков в серии

Перед тестированием определенной функции моего приложения Meteor с помощью Jasmine мне нужно подготовить разные вещи к тестам. Поэтому я использую beforeAll блоки.

  1. Сбросить базу данных
  2. Создать лекцию в базе данных
  3. Создать вопрос в базе данных
  4. Перейти на страницу только что созданной лекции
  5. Подождите, пока маршрутизатор завершит маршрутизацию

Эти асинхронные задачи должны выполняться последовательно. Я не могу сначала перейти на страницу лекции, а затем создать ее в базе данных. грустно beforeAll блоки в жасмине не будут автоматически работать последовательно.

Это мой текущий код:

  beforeAll(function(done) {
    Fixtures.clearDB(done);
  });

  beforeAll(function(done) {
    Fixtures.createLecture({}, function(error, result) {
      lectureCode = result;
      done();
    });
  });

  beforeAll(function(done) {
    Fixtures.createQuestion({}, done);
  });

  beforeAll(function(done) {
    Router.go('lecturePage', {lectureCode: lectureCode});
    Tracker.afterFlush(done);
  });

  beforeAll(waitForRouter);
  
  it("....", function() {
    ...
  });

Как я могу написать этот код в Жасмин в красивом стиле, не вдаваясь в ад обратного вызова?

Исходный код всего приложения с открытым исходным кодом и может быть найден на GitHub

Большое спасибо заранее, Макс

2 ответа

Решение

Вот ты где:

beforeAll(function(done) {
    async.series([
    function(callback) {
        Fixtures.clearDB(callback)
    },
    function(callback) {
        Fixtures.createLecture({}, function(error, result) {
            lectureCode = result;
            callback();
        });
    },
    function(callback) {
         Fixtures.createQuestion({}, callback);
    },
    function(callback) {
        Router.go('lecturePage', {lectureCode: lectureCode});
        Tracker.afterFlush(callback);
    }],function(err, results){ // callback called when all tasks are done
        done();
    });
}

Я не проверял это, но я надеюсь, что у вас есть идея. Вам необходимо создать список функций, каждая из которых будет снабжена функцией обратного вызова, которую необходимо вызвать, чтобы запустить следующую функцию. После этого вызывается последний обратный вызов, где мы можем вызвать done(), чтобы сообщить jasmine, что мы закончили. Надеюсь это поможет.

Мой общий подход будет иметь один beforeAll блок.

Внутри этого блока используйте API обещаний, чтобы связать все эти вызовы как обещания.

  beforeAll(function(done) {
    Fixtures.clearDB(done).then(...
  });

  beforeAll(waitForRouter);
  
  it("....", function() {
    ...
  });

Другие вопросы по тегам