'Jasmine: How to get name of current test

Is there a way of getting the name of the currently running test?

Some (heavily simplified) code may help explain. I want to avoid the duplication of "test1" / "test2" in the calls to performTest:

describe("My test category", function () {

    function performTest(uniqueName, speed) {
        var result = functionUnderTest(uniqueName, speed);
        expect(result).toBeTruthy();
    }

    it("test1", function () {
        performTest("test1", "fast");
    });

    it("test2", function () {
        performTest("test2", "slow");
    });
});

UPDATE I see the information I need is in:

jasmine.currentEnv_.currentSpec.description

or probably better:

jasmine.getEnv().currentSpec.description


Solution 1:[1]

jasmine.getEnv().currentSpec.description

Solution 2:[2]

It's not pretty (introduces a global variable) but you can do it with a custom reporter:

// current-spec-reporter.js

global.currentSpec = null;

class CurrentSpecReporter {

  specStarted(spec) {
    global.currentSpec = spec;
  }

  specDone() {
    global.currentSpec = null;
  }

}

module.exports = CurrentSpecReporter;

Add it to jasmine when you add your other reporters...

const CurrentSpecReporter = require('./current-spec-reporter.js');
// ...
jasmine.getEnv().addReporter(new CurrentSpecReporter());

Then extract the test name during your test/setup as needed...

  it('Should have an accessible description', () => {
    expect(global.currentSpec.description).toBe('Should have an accessible description');
  }

At last, see a sample of currentSpec structure:

{
  "id":"spec15",
  "description":"test1",
  "fullName":"My test category test1",
  "failedExpectations":[],
  "passedExpectations":[],
  "deprecationWarnings":[],
  "pendingReason":"",
  "duration":null,
  "properties":null
}

Solution 3:[3]

For anyone attempting to do this in Jasmine 2: You can introduce a subtle change to your declarations however that fix it. Instead of just doing:

it("name for it", function() {});

Define the it as a variable:

var spec = it("name for it", function() {
   console.log(spec.description); // prints "name for it"
});

This requires no plug-ins and works with standard Jasmine.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 GarethOwen
Solution 2 Top-Master
Solution 3 Ian