A little tool to generate Mocha BDD specs from Gherkin features
npm i mklabs/mocha-gherkin --save-dev
You might now cucumber. There is now a robust JavaScript based cucumber implementation \o/ with cucumber-js. This tool is not a replacement or even trying to compete with cucumber-js. If you want a real and valid cucumber implementation, search no more and head over the cucumber-js readme. A really neat project, worth watching which will get better and better.
Mocha is another tool I recently found , and I do like it. A lot. I felt like I needed and I could do a little tool to generate my mocha BDD tests stub.
It's not a test framework. It's not a cucumber-js replacement. It's not wrapping mocha to run the test, or defining any kind of report or mocha plugin.
This tool simply take a feature file, written in Gherkin syntax, as input, and output the matching Mocha BDD tests for this feature file. It has some notion of step definition (kinda) and can output you the missing step definition as well.
Usage: cat some.feature | ./node_modules/.bin/mocha-gherkin
Options:
-v, --version Output package version
-h, --help Output this help text
-s, --step Path to a step definition (kinda)
-m, --missing Will output missing step definition
instead of default generated test
$ cat file.feature | mocha-gherkin > test.js
with some step (like):
$ cat file.feature | mocha-gherkin -s ./steps/step-definition.js > test.js
The parser is a readable / writable stream, so you can pipe any stream connected to a valid feature like:
Feature: Example feature
As a very lazy programmer
I want to write some feature file
So that I can quickly make my mocha
Scenario: Reading the tests
Given I am in the test directory
When I read the index.js file
Then I should see "new Parser" somewhere
to a new Parser
, and pipe it to a given destination.
var Parser = require('mocha-gherkin');
fs.createReadStream('local.feature')
.pipe(new Parser)
.pipe(process.stdout);
You'll get matching Mocha BDD style specs:
describe("Example feature", function() {
describe("As a very lazy programmer I want to write some feature file So that I can quickly make my mocha", function() {
describe("Reading the tests", function() {
it("Given I am in the test directory", function() {
});
it("When I read the index.js file", function() {
});
it("Then I should see 'new Parser' somewhere", function() {
});
});
});
});
You can fill in the body of it()
handlers with some kind of step
definitions (definitely not valid cucumber step definitions.. but kind of)
var parser = new Parser({
step: fs.readFileSync('./steps.js', 'utf8')
});
The step.js
file is a JavaScript file running in a new vm context,
with Given
, When
, Then
and And
function available. Each one
takes two argument, a regexp to match and a callback to read and use as
a body function for mocha describe()
and it()
.
Captured parameters are available as $1
, $2
and so on, these
placeholders get replaced by their relevant values from
feature description.
Given(/I am in the "(.*)" directory/, function(done) {
this.base = process.cwd();
process.chdir(path.resolve('$1'));
done();
});
When(/I read the "(.*)" file/, function(done) {
this.file = fs.createReadStream('$1');
this.file.pause();
done();
});
And(/I pipe it through a "(.*)"/, function(done) {
var self = this;
this.output = '';
this.parser = this.file.pipe($1)
.on('data', function(c) { self.output += c })
.on('close', done);
this.file.resume();
});
Then(/I should see the content of "(.*)"/, function(done) {
process.chdir(this.base);
var output = this.output;
fs.readFile('$1', 'utf8', function(err, body) {
if(err) return done(err);
assert.equal(body.trim(), output.trim());
done();
});
});
When --missing
option is set, the output won't return the usual generated
step but rather return you snippets for any step missing. It's handy to quicly
generate the matching step file for a given feature file. Example:
$ cat example.feature | mocha-gherkin --missing
Should output:
Given(/I am in the test directory/, function() {
// add code for your definition here, regexp captured paramaters can be used
// in the function body with simple placeholders like $1, $2, ...
});
When(/I read the index.js file/, function() {
// add code for your definition here, regexp captured paramaters can be used
// in the function body with simple placeholders like $1, $2, ...
});
Then(/I should see 'new Parser' somewhere/, function() {
// add code for your definition here, regexp captured paramaters can be used
// in the function body with simple placeholders like $1, $2, ...
});