Ошибка "отложить" при выполнении последовательности выполнения до конца списка задач
У меня есть 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();
}
);
});