我如何使用gulp和胶带?

时间:2014-11-08 15:35:59

标签: javascript node.js testing gulp node.js-tape

我试图将Gulp与NodeJs测试工具Tape(https://github.com/substack/tape)集成在一起。

我该怎么做?似乎不是现有的gulp插件。

我已经看到了这一点,但看起来真的很不优雅:

var shell = require('gulp-shell')

gulp.task('exec-tests', shell.task([
  'tape test/* | faucet',
]));

gulp.task('autotest', ['exec-tests'], function() {
  gulp.watch(['app/**/*.js', 'test/**/*.js'], ['exec-tests']);
});

我已经尝试了这个,看起来应该可行:

var tape = require('tape');
var spec = require('tap-spec');


gulp.task('test', function() {
    return gulp.src(paths.serverTests, {
            read: false
        })
        .pipe(tape.createStream())
        .pipe(spec())
        .pipe(process.stdout);
});

但我收到TypeError: Invalid non-string/buffer chunk错误

6 个答案:

答案 0 :(得分:4)

你的“不雅”答案是最好的答案。并非每个问题都可以通过流来解决,并且使用gulp就像包装一样不是罪。

答案 1 :(得分:2)

是的,你的任务不会起作用,因为gulp流基于乙烯基,一种虚拟文件抽象。我真的不认为有一个很好的方法来处理这个问题,看起来你应该直接使用磁带API。我的意思是,如果你愿意的话,你可以在它周围加一些gulp任务糖:

var test = require('tape');
var spec = require('tap-spec');
var path = require('path');
var gulp = require('gulp');
var glob = require('glob');

gulp.task('default', function () {
    var stream = test.createStream()
        .pipe(spec())
        .pipe(process.stdout);

    glob.sync('path/to/tests/**/*.js').forEach(function (file) {
        require(path.resolve(file));
    });

    return stream;
});

对我来说似乎有些混乱;不仅因为我们没有使用任何gulp的流式抽象,而且我们甚至没有把它放入可以在之后挂入gulp管道的方式。此外,使用此代码时,您无法获得gulp的任务完成消息。如果有人知道如何解决这个问题,请成为我的客人。 : - )

我想我更喜欢在命令行上使用磁带。但是,如果你想在你的gulpfile中完成所有的构建步骤任务,这可能是要走的路。

答案 2 :(得分:1)

只需使用下面的代码和gulp tdd并使用带磁带的TDD :)

const tapNotify = require('tap-notify');
const colorize = require('tap-colorize');
const tape = require('gulp-tape');
const through = require('through2');
gulp.task('test',function(){
    process.stdout.write('\x1Bc');
    const reporter = through.obj();
    reporter.pipe(tapNotify({
        passed: {title: 'ok', wait:false},
        failed: {title: 'missing',wait:false}
    }));
    reporter
        .pipe(colorize())
        .pipe(process.stdout);
    return gulp.src('test/**/*.js')
        .pipe(tape({
            outputStream: through.obj(),
            reporter: reporter
        }));
});
gulp.task('tdd', function() {
    gulp.run('test');
    gulp.watch(['app/scripts/**/*.js*', 'test/**/*.js'],['test']);
});

答案 3 :(得分:0)

GitHub issue for tape jokeyrhyme 中提到gulp任务可以是Promises,并建议使用它来运行磁带测试。基于这个建议我已经做到了:

gulpfile.babel.js

import glob from "glob";

gulp.task("test", () => {
    let module = process.argv[process.argv.length - 1];

    return new Promise(resolve => {
        // Crude test for 'gulp test' vs. 'gulp test --module mod'
        if (module !== "test") {
            require(`./js/tape/${module}.js`);
            resolve();
            return;
        }

        glob.sync("./js/tape/*.js").forEach(f => require(f)));
        resolve();
    });
});

关注Ben's answer我怀疑我所做的事情并不是很好,但有一件事我注意到失败的测试不会导致非零退出代码(虽然我没有尝试Ben的方法来验证是否存在)。

答案 4 :(得分:0)

// npm i --save-dev gulp-tape
// npm i --save-dev faucet (just an example of using a TAP reporter)

import gulp from 'gulp';
import tape from 'gulp-tape'; 
import faucet from 'faucet';

gulp.task('test:js', () => {
    return gulp.src('src/**/*test.js')
        .pipe(tape({
            reporter: faucet()
        }));
});

答案 5 :(得分:0)

以下是我的解决方案的一个例子:

var gulp = require('gulp');
var tape = require('tape');
var File = require('vinyl');
var through = require('through2');
var exec = (require('child_process')).execSync;

function execShell(shcmd, opts) {
    var out = '';
    try {
        out = exec(shcmd, opts);
    } catch (e) {
        if (e.error) throw e.error;
        if (e.stdout) out = e.stdout.toString();
    }
    return out;
};

gulp.task('testreport', function(){
    return gulp.src(
        'testing/specs/tape_unit.js', {read: false}
    ).pipe(
        through.obj(function(file, encoding, next) {
            try{
                // get tape's report
                var tapout = execShell(
                    "./node_modules/.bin/tape " + file.path
                );
                // show the report in a console with tap-spec
                execShell(
                    "./node_modules/.bin/tap-spec", { input: tapout, stdio: [null, 1, 2] }
                );
                // make a json report
                var jsonout = execShell(
                    "./node_modules/.bin/tap-json", { input: tapout }
                );
                // do something with report's object
                // or prepare it for something like Bamboo
                var report = JSON.parse(jsonout.toString());
                // continue the stream with the json report
                next(null, new File({
                    path: 'spec_report.json',
                    contents: new Buffer(JSON.stringify(report, null, 2))
                }));
            }catch(err){ next(err) }
        })
    ).pipe(
        gulp.dest('testing/reports')
    );
});