Skip to content

Commit

Permalink
Pass scenario to hooks
Browse files Browse the repository at this point in the history
Allows to determine scenario name and so make hooks more useful and
scenario-oriented.

The `scenario` argument is optional in your hook functions. Both
following examples are fine:

    this.BeforeHook(function (scenario, callback) {
      callback();
    });

    this.AfterHook(function (callback) {
      callback();
    });
  • Loading branch information
vectart authored and jbpros committed Nov 29, 2013
1 parent 65d2176 commit 217edde
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 9 deletions.
4 changes: 2 additions & 2 deletions features/step_definitions/cucumber_js_mappings.rb
Expand Up @@ -176,7 +176,7 @@ def write_passing_hook options = {}

if hook_type == "around"
append_support_code <<-EOF
this.#{define_hook}(#{params}function(runScenario) {
this.#{define_hook}(#{params}function(scenario, runScenario) {
this.logCycleEvent('#{log_string}-pre');
runScenario(function(callback) {
this.logCycleEvent('#{log_string}-post');
Expand All @@ -186,7 +186,7 @@ def write_passing_hook options = {}
EOF
else
append_support_code <<-EOF
this.#{define_hook}(#{params}function(callback) {
this.#{define_hook}(#{params}function(scenario, callback) {
this.logCycleEvent('#{log_string}');
callback();
});
Expand Down
14 changes: 9 additions & 5 deletions features/step_definitions/cucumber_world.js
Expand Up @@ -164,18 +164,22 @@ proto.addHookWithTags = function (tags, callback) {
this._addHook({ type: "before", logEvent: "hook", tags: tags }, callback);
};

proto._addHook = function (options, callback) {
proto._addHook = function (options, scenario, callback) {
if (!callback) {
callback = options;
options = {};
if (scenario) {
callback = scenario;
} else {
callback = options;
options = {};
}
}
var type = "before";
var tags = "";
if (options.type) type = options.type;
if (!options.logEvent) options.logEvent = type;
if (options.tags) tags = '"' + options.tags + '", ';
var defineHook = (type == 'before' ? 'Before' : 'After');
this.stepDefinitions += defineHook + "(" + tags + "function(callback) {\
this.stepDefinitions += defineHook + "(" + tags + "function(scenario, callback) {\
world.logCycleEvent('" + options.logEvent + "');\
callback();\
});\n";
Expand All @@ -191,7 +195,7 @@ proto._addAroundHook = function (options, callback) {
var logEvent = "around";
if (options.tags) tags = '"' + options.tags + '", ';
if (options.logEvent) logEvent = options.logEvent;
this.stepDefinitions += "Around(" + tags + "function(runScenario) {\
this.stepDefinitions += "Around(" + tags + "function(scenario, runScenario) {\
world.logCycleEvent('" + logEvent + "-pre');\
runScenario(function(callback) {\
world.logCycleEvent('" + logEvent + "-post');\
Expand Down
5 changes: 4 additions & 1 deletion lib/cucumber/support_code/hook.js
Expand Up @@ -8,7 +8,10 @@ var Hook = function(code, options) {
var self = {
invokeBesideScenario: function invokeBesideScenario(scenario, world, callback) {
if (self.appliesToScenario(scenario))
code.call(world, callback);
if (code.length === 1)
code.call(world, callback);
else
code.call(world, scenario, callback);
else
callback(function(endPostScenarioAroundHook) { endPostScenarioAroundHook(); });
},
Expand Down
2 changes: 1 addition & 1 deletion spec/cucumber/support_code/hook_spec.js
Expand Up @@ -32,7 +32,7 @@ describe("Cucumber.SupportCode.Hook", function() {

it("calls the code with the world instance as this", function() {
hook.invokeBesideScenario(scenario, world, callback);
expect(code).toHaveBeenCalledWith(callback);
expect(code).toHaveBeenCalledWith(scenario, callback);
expect(code.mostRecentCall.object).toBe(world);
});

Expand Down

0 comments on commit 217edde

Please sign in to comment.