+++ /dev/null
-require File.dirname(__FILE__) + '/../story_helper'
-
-module Spec
- module Story
- module Runner
- describe ScenarioRunner do
- it 'should run a scenario in its story' do
- # given
- world = stub_everything
- scenario_runner = ScenarioRunner.new
- $answer = nil
- story = Story.new 'story', 'narrative' do
- @answer = 42 # this should be available to the scenario
- end
- scenario = Scenario.new story, 'scenario' do
- $answer = @answer
- end
-
- # when
- scenario_runner.run(scenario, world)
-
- # then
- $answer.should == 42
- end
-
- it 'should allow scenarios to share methods' do
- # given
- world = stub_everything
- $shared_invoked = 0
- story = Story.new 'story', 'narrative' do
- def shared
- $shared_invoked += 1
- end
- end
- scenario1 = Scenario.new story, 'scenario1' do
- shared()
- end
- scenario2 = Scenario.new story, 'scenario2' do
- shared()
- end
- scenario_runner = ScenarioRunner.new
-
- # when
- scenario_runner.run(scenario1, world)
- scenario_runner.run(scenario2, world)
-
- # then
- $shared_invoked.should == 2
- end
-
- it 'should notify listeners when a scenario starts' do
- # given
- world = stub_everything
- story = Story.new 'story', 'narrative' do end
- scenario = Scenario.new story, 'scenario1' do
- # succeeds
- end
- scenario_runner = ScenarioRunner.new
- mock_listener1 = stub_everything('listener1')
- mock_listener2 = stub_everything('listener2')
- scenario_runner.add_listener(mock_listener1)
- scenario_runner.add_listener(mock_listener2)
-
- # expect
- mock_listener1.should_receive(:scenario_started).with('story', 'scenario1')
- mock_listener2.should_receive(:scenario_started).with('story', 'scenario1')
-
- # when
- scenario_runner.run(scenario, world)
-
- # then
- end
-
- it 'should notify listeners when a scenario succeeds' do
- # given
- world = stub_everything('world')
- story = Story.new 'story', 'narrative' do end
- scenario = Scenario.new story, 'scenario1' do
- # succeeds
- end
- scenario_runner = ScenarioRunner.new
- mock_listener1 = stub_everything('listener1')
- mock_listener2 = stub_everything('listener2')
- scenario_runner.add_listener(mock_listener1)
- scenario_runner.add_listener(mock_listener2)
-
- # expect
- mock_listener1.should_receive(:scenario_succeeded).with('story', 'scenario1')
- mock_listener2.should_receive(:scenario_succeeded).with('story', 'scenario1')
-
- # when
- scenario_runner.run(scenario, world)
-
- # then
- end
-
- it 'should notify listeners ONCE when a scenario raises an error' do
- # given
- error = RuntimeError.new('oops')
- story = Story.new 'title', 'narrative' do end
- scenario = Scenario.new story, 'scenario1' do
- end
- scenario_runner = ScenarioRunner.new
- mock_listener = stub_everything('listener')
- scenario_runner.add_listener(mock_listener)
- world = stub_everything
-
- # expect
- world.should_receive(:errors).twice.and_return([error, error])
- mock_listener.should_receive(:scenario_failed).with('title', 'scenario1', error).once
-
- # when
- scenario_runner.run scenario, world
-
- # then
- end
-
- it 'should notify listeners when a scenario is pending' do
- # given
- pending_error = Spec::Example::ExamplePendingError.new('todo')
- story = Story.new 'title', 'narrative' do end
- scenario = Scenario.new story, 'scenario1' do
- end
- scenario_runner = ScenarioRunner.new
- mock_listener = mock('listener')
- scenario_runner.add_listener(mock_listener)
- world = stub_everything
-
- # expect
- world.should_receive(:errors).twice.and_return([pending_error, pending_error])
- mock_listener.should_receive(:scenario_started).with('title', 'scenario1')
- mock_listener.should_receive(:scenario_pending).with('title', 'scenario1', 'todo').once
-
- # when
- scenario_runner.run scenario, world
-
- # then
- end
- end
- end
- end
-end