如何使用磁带吞咽?

我正在尝试将Gulp和Tape( https://github.com/substack/tape ),NodeJstesting工具整合在一起。

我怎样才能做到这一点? 似乎没有一个现有的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错误

你的“不雅”答案是最好的。 并不是所有的问题都可以用stream解决,用吞吐作为包装并不是一种罪过。

对,你的任务将无法工作,因为吞咽stream是基于乙烯基,虚拟文件​​抽象。 我真的不觉得有一个很好的方式来处理这个问题,似乎你应该直接使用磁带API。 我的意思是,如果你愿意的话,你可以在它周围放一些糖水。

 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; }); 

似乎对我来说很凌乱; 这不仅是因为我们没有使用任何抽象的stream媒体抽象,但是我们甚至没有把它放到一个能够在之后进入一个吞咽stream水线的方式。 而且,在使用这个代码的时候,你也不可能得到一个完整的消息。 如果有人知道,那么请成为我的客人。 🙂

我想我宁愿在命令行上使用磁带。 但是,如果你想在你的gulp文件中完成所有的构build步骤任务,这可能是要走的路线。

只需使用下面的代码和gulp tdd 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']); }); 

在GitHub的磁带问题 jokeyrhyme提到吞咽任务可以是承诺,并build议使用它的方式来运行磁带testing。 根据我的build议,我做了这个:

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的答案我怀疑我所做的不是很好,但有一件事我注意到失败的testing不会导致非零的退出代码(虽然我没有尝试Ben的方法来validation是否这样)。

 // 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() })); }); 

这是我的解决scheme的一个例子:

 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') ); });