Gulp 将运行序列运行到任务列表末尾时发生的暂停延迟错误

Gulp 将运行序列运行到任务列表末尾时发生的暂停延迟错误,gulp,phpunit,run-sequence,Gulp,Phpunit,Run Sequence,我有一个用于Laravel应用程序的Gulpfile。应用程序的单元测试通过Gulp执行。要正确执行测试,以下任务应以同步顺序(通过运行序列)运行 备份当前的.env文件 将.env.testing设置为当前.env文件 创建单元测试将使用的数据库 运行迁移 执行单元测试 删除测试数据库 恢复我们在开始时创建的.env文件的备份 但是,当PHPUnit执行并且一个或多个单元测试失败时,就会出现问题。如果发生这种情况,序列将被破坏,因此无法切换回原始环境,我们将被困在测试环境中 这就是为什么我

我有一个用于Laravel应用程序的Gulpfile。应用程序的单元测试通过Gulp执行。要正确执行测试,以下任务应以同步顺序(通过运行序列)运行

  • 备份当前的.env文件
  • 将.env.testing设置为当前.env文件
  • 创建单元测试将使用的数据库
  • 运行迁移
  • 执行单元测试
  • 删除测试数据库
  • 恢复我们在开始时创建的.env文件的备份
但是,当PHPUnit执行并且一个或多个单元测试失败时,就会出现问题。如果发生这种情况,序列将被破坏,因此无法切换回原始环境,我们将被困在测试环境中

这就是为什么我想把PHPUnit错误推迟到序列的末尾。这样可以恢复环境,但出于CI目的,生成仍将标记为失败

我自己也试过一件事,如果失败了,我会大口大口地喝。执行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'));

经过一番磨蹭,我想出了如何让它工作:

当测试失败时,不需要出现
错误
任务,这是一种黑客行为

您可以将回调传递给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();
        }
    );
});

经过一番磨蹭,我想出了如何让它工作:

当测试失败时,不需要出现
错误
任务,这是一种黑客行为

您可以将回调传递给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();
        }
    );
});