Giter Club home page Giter Club logo

node-bdd-example's Introduction

A Node BDD Example

Sure you want to join the magical pony ride that is BDD! But how?

This repository helps to answer that question entirely within the nodejs ecosystem. I use grunt with the grunt-cucumber task to drive cucumber-js, our BDD/Gherkin framework, extended with the cucumber-wd-plugin and driven with wd, the nodejs selenium web driver, so Chrome terminates cleanly on saucelabs.

It sounds complicated, but after the initial setup things are pretty straight-forward.

Try it out

If you don't already have it installed you'll need nodejs and grunt-cli and a selenium server. I use saucelabs as my Selenium server, but you can also use this vagrant selenium grid if you would like to run it locally. Feel free to contact me if you'd like or send me a pull request.

You'll need to set the environment variables SAUCE_USERNAME and SAUCE_ACCESS_KEY. Here's the too-cool-for-school way:

    npm install
    SAUCE_USERNAME=<username> SAUCE_ACCESS_KEY=<access key> grunt test

If you have an issue setting environment variables you can set your username and access key directly in testConfig.js. Then you can just run

    npm install
    grunt test

Overview

If you ran the example then you should see an automated Google search. This scenario is defined in the file Search.feature using language that you might typically see a user use to explain what they are doing.

Cucumber takes that and uses implemented steps under step_definitions to map the natural language feature description to some code. It lets people and computers each speak their own language and makes me wonder why computer courses didn't count for foreign language credit.

There is some magic involved with the World stuff, which cucumber-js explains better than I would. But it is there to store your context while your scenario is executing.

And interfaces has all of your page, well, interfaces. Our UI interfaces are separated from our step implementations to reduce the brittleness of tests. A lot of people have made a lot of money writing a lot of books about this stuff.

Update!

cucumber-js 0.3.2 provides preliminary [unstable api] support for plugins through the use of registerListener in step definitions. Since the inclusion of this pull request, this example no longer needs to use the forked version of cucumber and cucumber-wd-plugin and cucumber-eavesdropper can be used directly with cucumber-js.

node-bdd-example's People

Contributors

devpaul avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

node-bdd-example's Issues

Tests failing on fresh clone and npm install: TypeError: Cannot call method 'get' of null

Fresh git clone'd and npm installed.

grunt test then gives me an error (full readout below).

~/C/t/node-bdd-example (master) grunt test
Running "cucumberjs:files" (cucumberjs) task
Event: BeforeFeatures

Feature: Search
  As a user I want to be able to do a basic search
  on the website and validate that a list of results
  have been returned

Event: BeforeFeature
Event: Background

  Scenario: Perform a search           # test/features/Search.feature:9
Event: BeforeScenario
Event: BeforeStep
    Given I am on the homepage         # test/features/Search.feature:7
      TypeError: Cannot call method 'get' of null
          at Page.visit [as _visit] (/Users/jskulski/Code/trulia/node-bdd-example/test/features/interfaces/Page.js:18:18)
          at Page.visit (/Users/jskulski/Code/trulia/node-bdd-example/test/features/interfaces/Homepage.js:19:17)
          at World.gotoPage (/Users/jskulski/Code/trulia/node-bdd-example/test/features/step_definitions/pageDefinitions.js:9:24)
          at Object.invoke (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/step_definition.js:84:14)
          at Object.execute (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/ast/step.js:157:22)
          at Object.acceptVisitor (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/ast/step.js:149:12)
          at Object.executeStep (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:178:12)
          at Object.processStep (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:173:14)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:66:16
          at callUserFunctionAndBroadcastAfterEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:90:9)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:14:11)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
          at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/cucumber/lib/cucumber/listener.js:8:9)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:118:51
          at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
          at handler (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/cucumber-eavesdropper-plugin/lib/Eavesdropper.js:8:5)
          at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/cucumber/lib/cucumber/listener.js:6:9)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:118:51
          at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
          at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
          at broadcastToListeners (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:117:19)
          at onRuntimeListenersComplete (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:113:9)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:14:11)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
          at hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener.js:8:9)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/pretty_formatter.js:15:7
          at hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener.js:8:9)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/summary_formatter.js:16:7
          at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener.js:8:9)
          at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/summary_formatter.js:15:18)
          at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/pretty_formatter.js:14:22)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:118:51
          at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
          at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
          at broadcastToListeners (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:117:19)
          at Object.broadcastEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:109:7)
          at Object.broadcastBeforeEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:100:12)
          at Object.broadcastEventAroundUserFunction (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:84:12)
          at Object.visitStep (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:63:12)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/ast/scenario.js:95:17
          at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
          at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
          at Object.instructVisitorToVisitSteps (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/ast/scenario.js:94:13)
          at Object.instructVisitorToVisitBackgroundSteps (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/ast/scenario.js:83:14)
          at Object.acceptVisitor (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/ast/scenario.js:74:12)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:48:41
          at callUserFunction (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/library/hooker.js:41:11)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:14:11)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
          at World.<anonymous> (/Users/jskulski/Code/trulia/node-bdd-example/test/features/step_definitions/worldDefinition.js:13:9)
          at Object.invokeBesideScenario (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/hook.js:11:14)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/library/hooker.js:64:20
          at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
          at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
          at Object.triggerBeforeHooks (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/library/hooker.js:63:19)
          at callBeforeHooks (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/library/hooker.js:37:16)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:14:11)
          at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
          at hookedUpFunction (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/library/hooker.js:27:21)
          at callUserFunctionAndBroadcastAfterEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:90:9)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:14:11)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
          at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/cucumber/lib/cucumber/listener.js:8:9)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:118:51
          at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
          at handler (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/cucumber-eavesdropper-plugin/lib/Eavesdropper.js:8:5)
          at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/cucumber/lib/cucumber/listener.js:6:9)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:118:51
          at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
          at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
          at broadcastToListeners (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:117:19)
          at onRuntimeListenersComplete (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:113:9)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:14:11)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
          at handleBeforeScenarioEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/pretty_formatter.js:55:5)
          at hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener.js:6:9)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/pretty_formatter.js:15:7
          at hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener.js:8:9)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/summary_formatter.js:16:7
          at handleBeforeScenarioEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/stats_journal.js:24:5)
          at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener.js:6:9)
          at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/summary_formatter.js:15:18)
          at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/pretty_formatter.js:14:22)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:118:51
          at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
          at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
          at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
          at broadcastToListeners (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:117:19)
          at Object.broadcastEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:109:7)
          at Object.broadcastBeforeEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:100:12)
          at Object.broadcastEventAroundUserFunction (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:84:12)
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:52:14
          at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/library.js:71:11
          at process._tickCallback (node.js:415:13)
Event: StepResult
Event: AfterStep
Event: BeforeStep
    When I perform a search            # test/features/Search.feature:10
Event: StepResult
Event: AfterStep
Event: BeforeStep
    Then I see the search results page # test/features/Search.feature:11
Event: StepResult
Event: AfterStep

Event: AfterScenario
Event: AfterFeature

(::) failed steps (::)

TypeError: Cannot call method 'get' of null
    at Page.visit [as _visit] (/Users/jskulski/Code/trulia/node-bdd-example/test/features/interfaces/Page.js:18:18)
    at Page.visit (/Users/jskulski/Code/trulia/node-bdd-example/test/features/interfaces/Homepage.js:19:17)
    at World.gotoPage (/Users/jskulski/Code/trulia/node-bdd-example/test/features/step_definitions/pageDefinitions.js:9:24)
    at Object.invoke (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/step_definition.js:84:14)
    at Object.execute (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/ast/step.js:157:22)
    at Object.acceptVisitor (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/ast/step.js:149:12)
    at Object.executeStep (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:178:12)
    at Object.processStep (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:173:14)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:66:16
    at callUserFunctionAndBroadcastAfterEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:90:9)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:14:11)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
    at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/cucumber/lib/cucumber/listener.js:8:9)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:118:51
    at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
    at handler (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/cucumber-eavesdropper-plugin/lib/Eavesdropper.js:8:5)
    at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/cucumber/lib/cucumber/listener.js:6:9)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:118:51
    at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
    at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
    at broadcastToListeners (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:117:19)
    at onRuntimeListenersComplete (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:113:9)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:14:11)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
    at hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener.js:8:9)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/pretty_formatter.js:15:7
    at hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener.js:8:9)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/summary_formatter.js:16:7
    at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener.js:8:9)
    at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/summary_formatter.js:15:18)
    at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/pretty_formatter.js:14:22)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:118:51
    at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
    at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
    at broadcastToListeners (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:117:19)
    at Object.broadcastEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:109:7)
    at Object.broadcastBeforeEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:100:12)
    at Object.broadcastEventAroundUserFunction (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:84:12)
    at Object.visitStep (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:63:12)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/ast/scenario.js:95:17
    at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
    at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
    at Object.instructVisitorToVisitSteps (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/ast/scenario.js:94:13)
    at Object.instructVisitorToVisitBackgroundSteps (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/ast/scenario.js:83:14)
    at Object.acceptVisitor (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/ast/scenario.js:74:12)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:48:41
    at callUserFunction (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/library/hooker.js:41:11)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:14:11)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
    at World.<anonymous> (/Users/jskulski/Code/trulia/node-bdd-example/test/features/step_definitions/worldDefinition.js:13:9)
    at Object.invokeBesideScenario (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/hook.js:11:14)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/library/hooker.js:64:20
    at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
    at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
    at Object.triggerBeforeHooks (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/library/hooker.js:63:19)
    at callBeforeHooks (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/library/hooker.js:37:16)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:14:11)
    at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
    at hookedUpFunction (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/library/hooker.js:27:21)
    at callUserFunctionAndBroadcastAfterEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:90:9)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:14:11)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
    at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/cucumber/lib/cucumber/listener.js:8:9)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:118:51
    at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
    at handler (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/cucumber-eavesdropper-plugin/lib/Eavesdropper.js:8:5)
    at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/cucumber/lib/cucumber/listener.js:6:9)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:118:51
    at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
    at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
    at broadcastToListeners (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:117:19)
    at onRuntimeListenersComplete (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:113:9)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:14:11)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:20:11
    at handleBeforeScenarioEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/pretty_formatter.js:55:5)
    at hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener.js:6:9)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/pretty_formatter.js:15:7
    at hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener.js:8:9)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/summary_formatter.js:16:7
    at handleBeforeScenarioEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/stats_journal.js:24:5)
    at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener.js:6:9)
    at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/summary_formatter.js:15:18)
    at Object.hear (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/listener/pretty_formatter.js:14:22)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:118:51
    at processItem (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:19:9)
    at iterate (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:12:11)
    at Object.forEach (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/type/collection.js:23:7)
    at broadcastToListeners (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:117:19)
    at Object.broadcastEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:109:7)
    at Object.broadcastBeforeEvent (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:100:12)
    at Object.broadcastEventAroundUserFunction (/Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:84:12)
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/runtime/ast_tree_walker.js:52:14
    at /Users/jskulski/Code/trulia/node-bdd-example/node_modules/grunt-cucumber/node_modules/cucumber/lib/cucumber/support_code/library.js:71:11
    at process._tickCallback (node.js:415:13)

Failing scenarios:
/Users/jskulski/Code/trulia/node-bdd-example/test/features/Search.feature:9 # Scenario: Perform a search

1 scenario (1 failed)
3 steps (1 failed, 2 skipped)
Event: AfterFeatures
Fatal error: Cannot call method 'quit' of null
~/C/t/node-bdd-example (master) 

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.