Ошибка "отложить" при выполнении последовательности выполнения до конца списка задач

У меня есть Gulpfile для приложения Laravel. Модульные тесты для приложения выполняются через Gulp. Для правильного выполнения тестов следующие задачи должны выполняться в синхронном порядке (через последовательность выполнения).

  • Резервное копирование текущего файла.env
  • Установить.env.testing как текущий файл.env
  • Создайте базу данных, которую будут использовать юнит-тесты
  • Запустить миграцию
  • Выполнить юнит-тесты
  • Удалить тестовую базу данных
  • Восстановите резервную копию файла.env, который мы сделали в начале

Это работает нормально, однако, существует проблема, когда PHPUnit выполняется и один или несколько модульных тестов не пройдены. Если это происходит, последовательность нарушается, и в результате переключение обратно в исходную среду не происходит, и мы застреваем в среде тестирования.

Вот почему я хотел бы отложить ошибку PHPUnit до конца последовательности. Таким образом, среда восстанавливается, но для целей CI сборка все равно будет помечена как сбойная.

Я сам что-то пробовал с gulp-if и gulp-fail. Код ошибки gulp выполняется, но последовательность выполнения продолжает выполняться в любом случае. Я не знаю, как это исправить.

Вот что я пытался поймать провал модульных тестов:

.on('error', function() {
       didTestsFail = true;
       this.emit('end');
   })

и с этой задачей я пытаюсь пометить сборку как неудачную:

gulp.task('error-when-tests-failed', function() {
    return gulp.src('./')
        .pipe(gulpIf(didTestsFail, fail()));
});

В общем, я использую глобальную переменную, чтобы определить, провалились ли модульные тесты или нет.

Вот полный Gulpfile:

var gulp = require('gulp'),
    del = require('del'),
    rename = require('gulp-rename'),
    exec = require('gulp-exec'),
    foreach = require('gulp-foreach'),
    gulpSequence = require('gulp-sequence').use(gulp),
    plumber = require('gulp-plumber'),
    phpunit = require('gulp-phpunit'),
    fail   = require('gulp-fail'),
    gulpIf = require('gulp-if'),
    db = require('gulp-db')({
        user: 'user',
        password: 'some_password',
        host: 'some_host',
        port: 'some_port',
        dialect: 'mysql'
    }),

    didTestsFail = false;

gulp.task('tests', function(cb) {
    gulpSequence(
        'back-up-active-env',
        'switch-testing-env',
        'create-test-database',
        'migrate',
        'phpunit',
        'drop-test-database',
        'restore-active-env',
        'error-when-tests-failed'
    )(cb);
});

gulp.task('phpunit', function(done) {
    var options = {
        debug: false,
        statusLine: true
    };

    return gulp.src('phpunit.xml')
               .pipe(plumber())
               .pipe(phpunit('./vendor/bin/phpunit', options))
               .on('error', function() {
                   didTestsFail = true;
                   this.emit('end');
               });
});

gulp.task('back-up-active-env', function() {
    del('env.temp');
    return gulp.src('.env')
        .pipe(plumber())
        .pipe(rename('.env.temp'))
        .pipe(gulp.dest('./'));
});

gulp.task('migrate', function() {
    return gulp.src('./')
        .pipe(plumber())
        .pipe(exec('php artisan migrate'));
});

gulp.task('switch-testing-env', function() {
    del('.env');
    return gulp.src('.env.testing')
        .pipe(plumber())
        .pipe(rename('.env'))
        .pipe(gulp.dest('./'))
        .pipe(exec('php artisan config:cache'));
});

gulp.task('restore-active-env', function() {
    del('.env');
    return gulp.src('.env.temp')
        .pipe(plumber())
        .pipe(rename('.env'))
        .pipe(gulp.dest('./'))
        .pipe(exec('php artisan config:cache'));
});

gulp.task('error-when-tests-failed', function() {
    return gulp.src('./')
        .pipe(gulpIf(didTestsFail, fail()));
});

gulp.task('create-test-database', db.create('test_db'));;
gulp.task('drop-test-database', db.drop('test_db'));

1 ответ

Решение

После некоторого возни я понял, как мне это сделать:

Там нет необходимости для error-when-tests-failed Задача, это все равно было немного хакерским.

Вы можете передать обратный вызов функции gulpSequence, в этом обратном вызове вы можете проверить, didTestsFail var true, если это так, вы можете выдать ошибку. Код выглядит следующим образом:

gulp.task('tests', function(done) {
    gulpSequence(
        'back-up-active-env',
        'switch-testing-env',
        'create-old-test-database',
        'create-new-test-database',
        'migrate',
        'phpunit',
        'drop-old-test-database',
        'drop-new-test-database',
        'restore-active-env',
        function() {
            if (didTestsFail) {
                throw new Error('One or more unit tests failed!');
            }
            done();
        }
    );
});
Другие вопросы по тегам