0.1.5 • Published 5 years ago

@phenomnomnominal/protractor-use-mocha-hook v0.1.5

Weekly downloads
40
License
MIT
Repository
github
Last release
5 years ago

@phenomnomnominal/protractor-use-mocha-hook

npm version Code Climate Test Coverage

Installation

npm install @phenomnomnominal/protractor-use-mocha-hook --save-dev

Why

This package is the culmination of a bunch of attempts to get Mocha hooks working well with Protractor, including when running tests in parallel.

This comment from Tractor describes some of the genesis:

// HACK:
// This is a bit weird. We want to run some code after each Mocha spec runs,
// so we can add extra data to the test report.
//
// FIRST ATTEMPT: Use Mocha's `afterEach` in a Protractor plugin.
// Tried calling `afterEach in the  `onPrepare` lifecycle took, but
// the global Mocha hooks aren't available yet.
//
// SECOND ATTEMPT: Move hooks to a separate file.
// By moving the hook calls to a separate file, we can push that file into
// the list of specs. This works well when running all the specs in serial,
// but stops working when running them in parallel, as the separate file will
// be run in a separate process.
//
// THIRD ATTEMPT: Use Mocha's `after` hook in a Protractor plugin.
// In the `postTest` part of a Protractor plugin, we have access to the
// `after` hook, so we can use that to attach the hook. Unfortunately,
// the `after` hook happens outside the context of the running test,
// so you can't attach the information to the right test.
//
// FOURTH ATTEMPT: Use Mocha's `afterEach` hook in a Protractor plugin.
// In the `postTest` part of a Protractor plugin, we have access to the
// `afterEach` hook. That's great, and we also have access to the right
// test context. Unfortunately, the hook will be added for *each* test!
// So we have to add a flag and make sure we only add the hook once
// per process.

This repo contains the FIFTH attempt, adding a setter which allows you to add a hook as soon as Mocha has added it to the global context. It is definitely still a hack 😅.

Usage

It can be used when creating an inline Protractor plugin like this:

protractorConfig.plugins.push({
    inline: {
        // use Protractor's setup to get in before Mocha's global `afterEach` hook is created
        setup () {
            // use `function` over `=>` to let Mocha set `this`:
            useMochaHook('afterEach', async function () {
                // do something
            });
        }
    }
});