1 require File.dirname(__FILE__) + '/../story_helper'
6 describe ScenarioRunner do
7 it 'should run a scenario in its story' do
9 world = stub_everything
10 scenario_runner = ScenarioRunner.new
12 story = Story.new 'story', 'narrative' do
13 @answer = 42 # this should be available to the scenario
15 scenario = Scenario.new story, 'scenario' do
20 scenario_runner.run(scenario, world)
23 ensure_that $answer, is(42)
26 it 'should allow scenarios to share methods' do
28 world = stub_everything
30 story = Story.new 'story', 'narrative' do
35 scenario1 = Scenario.new story, 'scenario1' do
38 scenario2 = Scenario.new story, 'scenario2' do
41 scenario_runner = ScenarioRunner.new
44 scenario_runner.run(scenario1, world)
45 scenario_runner.run(scenario2, world)
48 $shared_invoked.should == 2
51 it 'should notify listeners when a scenario starts' do
53 world = stub_everything
54 story = Story.new 'story', 'narrative' do end
55 scenario = Scenario.new story, 'scenario1' do
58 scenario_runner = ScenarioRunner.new
59 mock_listener1 = stub_everything('listener1')
60 mock_listener2 = stub_everything('listener2')
61 scenario_runner.add_listener(mock_listener1)
62 scenario_runner.add_listener(mock_listener2)
65 mock_listener1.should_receive(:scenario_started).with('story', 'scenario1')
66 mock_listener2.should_receive(:scenario_started).with('story', 'scenario1')
69 scenario_runner.run(scenario, world)
75 it 'should notify listeners when a scenario succeeds' do
77 world = stub_everything('world')
78 story = Story.new 'story', 'narrative' do end
79 scenario = Scenario.new story, 'scenario1' do
82 scenario_runner = ScenarioRunner.new
83 mock_listener1 = stub_everything('listener1')
84 mock_listener2 = stub_everything('listener2')
85 scenario_runner.add_listener(mock_listener1)
86 scenario_runner.add_listener(mock_listener2)
89 mock_listener1.should_receive(:scenario_succeeded).with('story', 'scenario1')
90 mock_listener2.should_receive(:scenario_succeeded).with('story', 'scenario1')
93 scenario_runner.run(scenario, world)
99 it 'should notify listeners when a scenario raises an error' do
101 error = RuntimeError.new('oops')
102 story = Story.new 'title', 'narrative' do end
103 scenario = Scenario.new story, 'scenario1' do
105 scenario_runner = ScenarioRunner.new
106 mock_listener = stub_everything('listener')
107 scenario_runner.add_listener(mock_listener)
108 world = stub_everything
111 world.should_receive(:errors).twice.and_return([error])
112 mock_listener.should_receive(:scenario_failed).with('title', 'scenario1', error)
115 scenario_runner.run scenario, world
121 it 'should notify listeners when a scenario is pending' do
123 pending_error = Spec::Example::ExamplePendingError.new('todo')
124 story = Story.new 'title', 'narrative' do end
125 scenario = Scenario.new story, 'scenario1' do
127 scenario_runner = ScenarioRunner.new
128 mock_listener = mock('listener')
129 scenario_runner.add_listener(mock_listener)
130 world = stub_everything
133 world.should_receive(:errors).twice.and_return([pending_error])
134 mock_listener.should_receive(:scenario_started).with('title', 'scenario1')
135 mock_listener.should_receive(:scenario_pending).with('title', 'scenario1', 'todo')
138 scenario_runner.run scenario, world