我试图将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
错误
答案 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')
);
});