diff --git a/examples/typescript/specs/step-definitions/auto-binding/auto-step-binding-snack-vending-use-context.steps.ts b/examples/typescript/specs/step-definitions/auto-binding/auto-step-binding-snack-vending-use-context.steps.ts new file mode 100644 index 0000000..dd54140 --- /dev/null +++ b/examples/typescript/specs/step-definitions/auto-binding/auto-step-binding-snack-vending-use-context.steps.ts @@ -0,0 +1,30 @@ +import { autoBindSteps, loadFeature, StepDefinitionsWithContext } from '../../../../../src'; +import { VendingMachine } from '../../../src/vending-machine'; + +type Context = { + vendingMachine: VendingMachine; +}; + +export const vendingMachineSteps: StepDefinitionsWithContext = ({ given, and, when, then, context }) => { + given(/^the vending machine has "(.*)" in stock$/, (itemName: string) => { + context.vendingMachine = new VendingMachine(); + context.vendingMachine.stockItem(itemName, 1); + }); + + and('I have inserted the correct amount of money', () => { + context.vendingMachine.insertMoney(0.5); + }); + + when(/^I purchase "(.*)"$/, (itemName: string) => { + context.vendingMachine.dispenseItem(itemName); + }); + + then(/^my "(.*)" should be dispensed$/, (itemName: string) => { + const inventoryAmount = context.vendingMachine.items[itemName]; + expect(inventoryAmount).toBe(0); + }); +}; + +const features = loadFeature('./examples/typescript/specs/features/auto-binding/snack-vending-machine.feature'); + +autoBindSteps(features, [vendingMachineSteps]); diff --git a/src/automatic-step-binding.ts b/src/automatic-step-binding.ts index 420124b..eb3b660 100644 --- a/src/automatic-step-binding.ts +++ b/src/automatic-step-binding.ts @@ -1,6 +1,10 @@ import { ParsedFeature } from './models'; import { matchSteps } from './validation/step-definition-validation'; -import { StepsDefinitionCallbackFunction, createDefineFeature, IJestLike } from './feature-definition-creation'; +import { + createDefineFeature, + IJestLike, + type StepsDefinitionCallbackFunctionWithContext, +} from './feature-definition-creation'; import { generateStepCode } from './code-generation/step-generation'; const globalSteps: Array<{ stepMatcher: string | RegExp; stepFunction: () => unknown }> = []; @@ -12,12 +16,17 @@ const registerStep = (stepMatcher: string | RegExp, stepFunction: () => unknown) export const createAutoBindSteps = (jestLike: IJestLike) => { const defineFeature = createDefineFeature(jestLike); - return (parsedFeatures: ParsedFeature | ParsedFeature[], stepDefinitions: StepsDefinitionCallbackFunction[]) => { + return = NonNullable>( + parsedFeatures: ParsedFeature | ParsedFeature[], + stepDefinitions: StepsDefinitionCallbackFunctionWithContext[], + ) => { let features = parsedFeatures; if (!Array.isArray(features)) { features = [features]; } + const context = {} as C; + stepDefinitions.forEach(stepDefinitionCallback => { stepDefinitionCallback({ defineStep: registerStep, @@ -29,6 +38,7 @@ export const createAutoBindSteps = (jestLike: IJestLike) => { pending: () => { // Nothing to do }, + context, }); }); diff --git a/src/feature-definition-creation.ts b/src/feature-definition-creation.ts index c045666..e4e15e5 100644 --- a/src/feature-definition-creation.ts +++ b/src/feature-definition-creation.ts @@ -24,6 +24,11 @@ export type StepsDefinitionCallbackOptions = { pending: () => void; }; +export type StepsDefinitionCallbackOptionsWithContext = NonNullable> = + StepsDefinitionCallbackOptions & { + context: C; + }; + export interface IJestLike { describe: jest.Describe; test: jest.It; @@ -44,6 +49,9 @@ export type DefineScenarioFunctionWithAliases = DefineScenarioFunction & { }; export type StepsDefinitionCallbackFunction = (options: StepsDefinitionCallbackOptions) => void; +export type StepsDefinitionCallbackFunctionWithContext = NonNullable> = ( + options: StepsDefinitionCallbackOptionsWithContext, +) => void; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type DefineStepFunction = (stepMatcher: string | RegExp, stepDefinitionCallback: (...args: any[]) => any) => any; export type DefineFeatureFunction = ( diff --git a/src/index.ts b/src/index.ts index 7264f70..55e45f2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,7 +8,11 @@ export { generateCodeFromFeature, generateCodeWithSeparateFunctionsFromFeature, } from './code-generation/generate-code-by-line-number'; -export { StepsDefinitionCallbackFunction as StepDefinitions, IJestLike } from './feature-definition-creation'; +export { + StepsDefinitionCallbackFunction as StepDefinitions, + StepsDefinitionCallbackFunctionWithContext as StepDefinitionsWithContext, + IJestLike, +} from './feature-definition-creation'; const jestLike: IJestLike = { describe,