0

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

  • 备份当前的 .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'));
4

1 回答 1

2

经过一番摆弄后,我想出了如何使它工作:

没有必要完成这项error-when-tests-failed任务,无论如何这有点骇人听闻。

您可以将回调传递给 gulpSequence 函数,在此回调中您可以检查didTestsFailvar 是否为真,如果是则抛出错误。代码如下所示:

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();
        }
    );
});
于 2017-05-02T14:01:39.643 回答