code: function(name, definition) {
        if (!_.isString(name)) {
          throw new Error('Step name must be a string, got ' + typeof(name));
        } else if (typeof(definition) != 'function') {
          throw new Error('Step definition must be a function, got ' + typeof(definition));
        } else if (this.findStep(name)) {
          throw new Error('Step "' + name + '" is already defined');
        }
  
        this.steps.push({ name: name, definition: definition });
        return this;
      }
docs: <a name="method-step"></a> ### #step(name, definition) Adds a named step to this scenario.  The **name** is mandatory and must be unique as it can be used for flow control (see `#setNextStep`).  The **definition** must be a function. The value it returns will be the first argument of the next step.  scenario.step('a step', function() { return computeSomething(); });  scenario.step('another step', function(computedData) { console.log(computedData); });  A step can also return a promise. In that case, its future value will be the first argument of the next step when the promise is resolved. For example, the HTTP client returns a promise.  scenario.step('a step with an HTTP call', function() { return this.get({ url: 'http://example.com' }); });  scenario.step('check the response', function(response) { console.log(response.statusCode); });  If the promise is rejected, the step fails and the scenario is interrupted.