Skip to content

Commit f46fa68

Browse files
hmalphettescharlierudolph
authored andcommitted
handle empty stacktraces (#605)
1 parent 392b702 commit f46fa68

File tree

2 files changed

+55
-9
lines changed

2 files changed

+55
-9
lines changed

features/custom_stack_trace.feature

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
Feature: Custom stack trace
2+
3+
Scenario: Error.prepareStackTrace override
4+
Given a file named "features/a.feature" with:
5+
"""
6+
Feature: Some feature
7+
Scenario: Some scenario
8+
Given Error.prepareStackTrace has been overriden
9+
"""
10+
Given a file named "features/step_definitions/cucumber_steps.js" with:
11+
"""
12+
var cucumberSteps = function() {
13+
var _prepareStackTrace = Error.prepareStackTrace;
14+
Error.prepareStackTrace = function() {
15+
return 'Custom message';
16+
}
17+
18+
this.When(/^Error.prepareStackTrace has been overriden$/, function() {
19+
});
20+
21+
Error.prepareStackTrace = _prepareStackTrace;
22+
};
23+
module.exports = cucumberSteps;
24+
"""
25+
When I run cucumber.js
26+
Then it outputs this text:
27+
"""
28+
Feature: Some feature
29+
30+
Scenario: Some scenario
31+
✓ Given Error.prepareStackTrace has been overriden
32+
33+
1 scenario (1 passed)
34+
1 step (1 passed)
35+
<duration-stat>
36+
"""
37+
And the exit status should be 0

lib/cucumber/support_code/library.js

+18-9
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ function Library(supportCodeDefinition) {
2424
});
2525
}
2626

27+
function getStackframe() {
28+
var stackframes = StackTrace.getSync();
29+
if (stackframes.length > 2) {
30+
return stackframes[2];
31+
} else {
32+
return stackframes[0];
33+
}
34+
}
35+
2736
var self = {
2837
lookupBeforeHooksByScenario: function lookupBeforeHooksByScenario(scenario) {
2938
return self.lookupHooksByScenario(beforeHooks, scenario);
@@ -53,9 +62,9 @@ function Library(supportCodeDefinition) {
5362
code = options;
5463
options = {};
5564
}
56-
var stackframes = StackTrace.getSync();
57-
var line = stackframes[1].getLineNumber();
58-
var uri = stackframes[1].getFileName() || 'unknown';
65+
var stackframe = getStackframe();
66+
var line = stackframe.getLineNumber();
67+
var uri = stackframe.getFileName() || 'unknown';
5968
var hook = builder(code, options, uri, line);
6069
collection.push(hook);
6170
};
@@ -66,9 +75,9 @@ function Library(supportCodeDefinition) {
6675
code = options;
6776
options = {};
6877
}
69-
var stackframes = StackTrace.getSync();
70-
var line = stackframes[1].getLineNumber();
71-
var uri = stackframes[1].getFileName() || 'unknown';
78+
var stackframe = getStackframe();
79+
var line = stackframe.getLineNumber();
80+
var uri = stackframe.getFileName() || 'unknown';
7281
var stepDefinition = Cucumber.SupportCode.StepDefinition(name, options, code, uri, line);
7382
stepDefinitions.push(stepDefinition);
7483
},
@@ -82,9 +91,9 @@ function Library(supportCodeDefinition) {
8291
handler = options;
8392
options = {};
8493
}
85-
var stackframes = StackTrace.getSync();
86-
options.line = stackframes[1].getLineNumber();
87-
options.uri = stackframes[1].getFileName() || 'unknown';
94+
var stackframe = getStackframe();
95+
options.line = stackframe.getLineNumber();
96+
options.uri = stackframe.getFileName() || 'unknown';
8897
var listener = Cucumber.Listener(options);
8998
listener.setHandlerForEvent(eventName, handler);
9099
self.registerListener(listener);

0 commit comments

Comments
 (0)