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)
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)
74 it 'should notify listeners when a scenario succeeds' do
76 world = stub_everything('world')
77 story = Story.new 'story', 'narrative' do end
78 scenario = Scenario.new story, 'scenario1' do
81 scenario_runner = ScenarioRunner.new
82 mock_listener1 = stub_everything('listener1')
83 mock_listener2 = stub_everything('listener2')
84 scenario_runner.add_listener(mock_listener1)
85 scenario_runner.add_listener(mock_listener2)
88 mock_listener1.should_receive(:scenario_succeeded).with('story', 'scenario1')
89 mock_listener2.should_receive(:scenario_succeeded).with('story', 'scenario1')
92 scenario_runner.run(scenario, world)
97 it 'should notify listeners ONCE when a scenario raises an error' do
99 error = RuntimeError.new('oops')
100 story = Story.new 'title', 'narrative' do end
101 scenario = Scenario.new story, 'scenario1' do
103 scenario_runner = ScenarioRunner.new
104 mock_listener = stub_everything('listener')
105 scenario_runner.add_listener(mock_listener)
106 world = stub_everything
109 world.should_receive(:errors).twice.and_return([error, error])
110 mock_listener.should_receive(:scenario_failed).with('title', 'scenario1', error).once
113 scenario_runner.run scenario, world
118 it 'should notify listeners when a scenario is pending' do
120 pending_error = Spec::Example::ExamplePendingError.new('todo')
121 story = Story.new 'title', 'narrative' do end
122 scenario = Scenario.new story, 'scenario1' do
124 scenario_runner = ScenarioRunner.new
125 mock_listener = mock('listener')
126 scenario_runner.add_listener(mock_listener)
127 world = stub_everything
130 world.should_receive(:errors).twice.and_return([pending_error, pending_error])
131 mock_listener.should_receive(:scenario_started).with('title', 'scenario1')
132 mock_listener.should_receive(:scenario_pending).with('title', 'scenario1', 'todo').once
135 scenario_runner.run scenario, world