4

我正在尝试将 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错误

4

6 回答 6

4

您的“不雅”答案是最好的答案。并不是每个问题都可以用流来最好地解决,并且将 gulp 用作包装器并不是一种罪过。

于 2015-09-01T08:58:29.547 回答
2

是的,你的任务不会工作,因为 gulp 流是基于乙烯基的,一种虚拟文件抽象。我真的不认为在 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 中的所有构建步骤任务,这可能是要走的路。

于 2015-01-09T00:38:18.430 回答
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']);
});
于 2016-01-23T07:42:54.183 回答
0

磁带的 GitHub 问题中, 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 的回答,我怀疑我所做的并不是很好,因为一方面我注意到失败的测试不会导致非零退出代码(尽管我没有尝试过 Ben 的验证方法是否如此)。

于 2015-10-08T11:50:20.923 回答
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()
        }));
});
于 2015-12-29T13:48:26.570 回答
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')
    );
});
于 2016-03-10T14:57:56.683 回答