A Mocha BDD integration
npm install mocha-cakes-2Mocha Cakes is a Gherkin/Cucumber syntax integration for the Mocha testing framework.


NPM:
```
npm install --save-dev mocha-cakes-2
To enable the Mocha integration you need to specify mocha-cakes-2 in the ui option.
#### CLI
Either use the command line argument:
` javascript`
mocha --ui mocha-cakes-2 path/to/my/tests
Or set it in your mocha.opts file:
` javascript`
--ui mocha-cakes-2
#### API
Either pass it in the options as you construct Mocha:
` javascript`
var mocha = new Mocha({
ui: 'mocha-cakes-2'
});
Or set it after you've constructed Mocha:
` javascript`
var mocha = new Mocha();
mocha.ui('mocha-cakes-2')
`javascript
require('chai').should();
Feature('Some feature', () => {
Scenario('Some Scenario', () => {
let number = 2;
Given('a number', () => {
number.should.exist;
});
And('that number is 2', () => {
number.should.equal(2);
});
When('adding 40', () => {
number += 40;
});
Then('the number should be 42', () => {
number.should.equal(42);
});
});
});
`
The result will look something like this:

The common Mocha functions (describe, it, before, after, etc) are also available and can be used together with Mocha Cakes.
Replace the require('mocha-cakes-2') statement(s) with the --ui mocha-cakes-2 option as described above.
The TypeScript definitions are bundled together with mocha-cakes-2.
To use mocha directly with TypeScript you need types for mocha and ts-node.
``
npm install --save-dev typescript ts-node @types/mocha
You should have a tsconfig.json in the root of your project like so
`json`
{
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "node"
}
}
Now you can run it like so:
``
mocha -r ts-node/register --ui mocha-cakes-2 ...
Your tests should look like this:
`
import 'mocha-cakes-2';
Feature('Some feature', () => {
Scenario('Some Scenario', () => {
let number = 2;
Given('a number', () => {
});
And('that number is 2', () => {
});
When('adding 40', () => {
});
Then('the number should be 42', () => {
});
});
});
`
The Mocha Cakes integration adds the following functions to the global scope:
* Feature | featureScenario | scenario
* Given | given
- When | when
- Then | then
- And | and
- But | but
-
Skips a test clause. Works on all test functions.
`javascript
Feature('Some feature', () => {
Scenario.skip('Skipped scenario', () => {
// ...
});
Scenario('Ordinary', () => {
// ...
});
});
`

Only run the specified test clause. Works on all test functions.
`javascript
Feature('Some feature', () => {
Scenario('First scenario', () => {
// ...
});
Scenario('Second scenario', () => {
// ...
});
Scenario.only('Only I will run!', () => {
// ...
});
// ...
});
`

Executes the provided function only once for each of the scenarios under the current scope.
`javascript
Feature('Some feature', () => {
beforeEachScenario( () => {
someSetup();
});
afterEachScenario( () => {
doCleanup();
});
Scenario('First scenario', () => {
// ...
});
Scenario('Second scenario', () => {
// ...
});
// ...
});
`
Executes the provided function only once for each of the features under the current scope.
`javascript
beforeEachFeature( () => {
someSetup();
});
afterEachFeature( () => {
doCleanup();
});
Feature('Some feature', () => {
// ...
});
Feature('Another feature', () => {
// ...
});
// ...
`
If you use Mocha directly to run the tests you can set the MOCHA_INTERFACE environment variable to either cli or api to choose which Mocha interface to run the tests with: MOCHA_INTERFACE=api mocha test/feature/tests.js.
MOCHA_INTERFACE will default to cli if no value is set.
When you run npm run test:cli or npm run test:api (or npm test to run them both), MOCHA_INTERFACE` is set automatically to the appropriate value.
Mocha Cakes 2 is heavily influenced by quangv's mocha-cakes.