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

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

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

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

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

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

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

.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'));

person SolveSoul    schedule 02.05.2017    source источник


Ответы (1)


Немного повозившись, я понял, как заставить его работать:

В задаче error-when-tests-failed нет необходимости, она все равно была какой-то хакерской.

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

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();
        }
    );
});
person SolveSoul    schedule 02.05.2017