A simple CLI tool that allows conversion from .feature (gherkin) syntax to Jest test file, and the inverse (ie from a test, generate feature files).
Pre-requisites: Jest
Install as dev dependency:
npm install specjest --save-dev
or use directly as a globally installed package
npx specjest <command>
⏩ Convert gherkin (.feature) to a todo test file
Create a .feature file:
Feature: Create User Command
Scenario: Happy path - new user
Given a non-existing user
And avatar_url is set
And name is set
And email is set
And selected_project_id is null
When user data is sumbitted
Then user is persisted to DB
And user created event is dispatched
npx specjest test <path/to/file.feature>
Result: a Jest test is created with all the tests set to "todo"
describe(`Feature: Create User Command`, () => {
describe(`Scenario: Happy path - new user`, () => {
describe(`Given a non-existing user
And avatar_url is set
And name is set
And email is set
And selected_project_id is null`, () => {
describe(`When user data is sumbitted`, () => {
test.todo(`Then user is persisted to DB`);
test.todo(`And user created event is dispatched`);
});
});
});
});
⏩ Convert behavioural jest tests to a gherkin (.feature)
⚙️ Run all tests and generate feature files:
This basically consists of adding --json directive to you jest command and piping it into Specjest, if your tests contain correct gherkin syntax they will be processed.
<your-jest-command> --json | npx specjest feat
example yarn test:spec --json | npx specjest feat
⚙️ To generate for specific path or test pattern:
<your-jest-command> <testRegex> --json | npx specjest feat
Note: depending on your pacakge.json configuration, you may need to adjust these commands to take into consideration the project's jest configuration.
Result : Specjest will report on all test files processed and the outcome
✅ Successfully written feature files:
📄 src/app/emails/use-cases/sync-all-command/sync-all.feature
❌ Failed to parse tests:
📄 src/app/email/model/validation.test.ts
💬 cannot determine type of Bdd Description: should...
✨ Done in 0.62s.