diff --git a/lib/frameworks/__protractor_internal_afterEach_setup_spec.js b/lib/frameworks/__protractor_internal_afterEach_setup_spec.js new file mode 100644 index 000000000..e0b40d762 --- /dev/null +++ b/lib/frameworks/__protractor_internal_afterEach_setup_spec.js @@ -0,0 +1,9 @@ +// This is spec file is automatically added by protractor to implement our +// `afterEach` functionality for jasmine and mocha. + +afterEach(function() { + let hook = require('./setupAfterEach').hooks.afterEach; + if (hook) { + return hook(); + } +}); diff --git a/lib/frameworks/jasmine.js b/lib/frameworks/jasmine.js index 0ecd95f9c..49750ae15 100644 --- a/lib/frameworks/jasmine.js +++ b/lib/frameworks/jasmine.js @@ -75,6 +75,9 @@ exports.run = function(runner, specs) { var reporter = new RunnerReporter(runner); jasmine.getEnv().addReporter(reporter); + // Add hooks for afterEach + require('./setupAfterEach').setup(runner, specs); + // Filter specs to run based on jasmineNodeOpts.grep and jasmineNodeOpts.invert. jasmine.getEnv().specFilter = function(spec) { var grepMatch = !jasmineNodeOpts || diff --git a/lib/frameworks/mocha.js b/lib/frameworks/mocha.js index 8b65007de..ea9bc65c5 100644 --- a/lib/frameworks/mocha.js +++ b/lib/frameworks/mocha.js @@ -12,6 +12,9 @@ exports.run = function(runner, specs) { var Mocha = require('mocha'), mocha = new Mocha(runner.getConfig().mochaOpts); + // Add hooks for afterEach + require('./setupAfterEach').setup(runner, specs); + var deferred = q.defer(); // Mocha doesn't set up the ui until the pre-require event, so diff --git a/lib/frameworks/setupAfterEach.js b/lib/frameworks/setupAfterEach.js new file mode 100644 index 000000000..04c8db87b --- /dev/null +++ b/lib/frameworks/setupAfterEach.js @@ -0,0 +1,29 @@ +/** + * Setup afterEach hook for jasmine/mocha tests. + * + * One of the main purposes of this file is to give `__protractor_internal_afterEach_setup_spec.js` + * a place to look up `runner.afterEach` at runtime without using globals. + * This file needs to be separate from `__protractor_internal_afterEach_setup_spec.js` so that that + * file is not prematurely executed. + */ + +var path = require('path'); + +// Queried by `protractor_internal_afterEach_setup_spec.js` for the `afterEach` hook +var hooks = { + afterEach: null +}; + +exports.hooks = hooks; + +/** + * Setup `runner.afterEach` to be called after every spec. + * + * @param {Runner} runner The current Protractor Runner. + * @param {Array} specs Array of Directory Path Strings. Must be a reference to the same array + * instance used by the framework + */ +exports.setup = function(runner, specs) { + hooks.afterEach = runner.afterEach; + specs.push(path.resolve(__dirname, '__protractor_internal_afterEach_setup_spec.js')); +};