1 require File.dirname(__FILE__) + '/../../spec_helper'
5 class ExampleModuleScopingSpec < ExampleGroup
6 describe ExampleGroup, "via a class definition"
17 it "should understand module scoping" do
23 it "should allow class variables to be defined" do
28 class ExampleClassVariablePollutionSpec < ExampleGroup
29 describe ExampleGroup, "via a class definition without a class variable"
31 it "should not retain class variables from other Example classes" do
34 end.should raise_error
38 describe ExampleGroup, "#pending" do
39 it "should raise a Pending error when its block fails" do
42 pending("something") do
44 raise "something wrong with my example"
46 }.should raise_error(Spec::Example::ExamplePendingError, "something")
47 block_ran.should == true
50 it "should raise Spec::Example::PendingExampleFixedError when its block does not fail" do
53 pending("something") do
56 }.should raise_error(Spec::Example::PendingExampleFixedError, "Expected pending 'something' to fail. No Error was raised.")
57 block_ran.should == true
61 describe ExampleGroup, "#run with failure in example", :shared => true do
62 it "should add an example failure to the TestResult" do
63 example_group.run.should be_false
67 describe ExampleGroup, "#run" do
68 it_should_behave_like "sandboxed rspec_options"
69 attr_reader :example_group, :formatter, :reporter
71 @formatter = mock("formatter", :null_object => true)
72 options.formatters << formatter
73 options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true)
74 @reporter = FakeReporter.new(options)
75 options.reporter = reporter
76 @example_group = Class.new(ExampleGroup) do
81 class << example_group
90 it "should not run when there are no examples" do
91 example_group = Class.new(ExampleGroup) do
94 example_group.examples.should be_empty
96 reporter = mock("Reporter")
97 reporter.should_not_receive(:add_example_group)
101 describe "when before_each fails" do
103 $example_ran = $after_each_ran = false
104 @example_group = describe("Foobar") do
105 before(:each) {raise}
106 it "should not be run" do
110 $after_each_ran = true
115 it "should not run example block" do
117 $example_ran.should be_false
120 it "should run after_each" do
122 $after_each_ran.should be_true
125 it "should report failure location when in before_each" do
126 reporter.should_receive(:example_finished) do |example_group, error|
127 error.message.should eql("in before_each")
133 describe ExampleGroup, "#run on dry run" do
135 @options.dry_run = true
138 it "should not run before(:all) or after(:all)" do
139 before_all_ran = false
140 after_all_ran = false
141 ExampleGroup.before(:all) { before_all_ran = true }
142 ExampleGroup.after(:all) { after_all_ran = true }
143 example_group.it("should") {}
145 before_all_ran.should be_false
146 after_all_ran.should be_false
149 it "should not run example" do
151 example_group.it("should") {example_ran = true}
153 example_ran.should be_false
157 describe ExampleGroup, "#run with specified examples" do
158 attr_reader :examples_that_were_run
160 @examples_that_were_run = []
163 describe "when specified_examples matches entire ExampleGroup" do
165 examples_that_were_run = @examples_that_were_run
166 @example_group = Class.new(ExampleGroup) do
167 describe("the ExampleGroup")
168 it("should be run") do
169 examples_that_were_run << 'should be run'
172 it("should also be run") do
173 examples_that_were_run << 'should also be run'
176 options.examples = ["the ExampleGroup"]
179 it "should not run the Examples in the ExampleGroup" do
181 examples_that_were_run.should == ['should be run', 'should also be run']
185 describe ExampleGroup, "#run when specified_examples matches only Example description" do
187 examples_that_were_run = @examples_that_were_run
188 @example_group = Class.new(ExampleGroup) do
190 it("should be run") do
191 examples_that_were_run << 'should be run'
194 options.examples = ["should be run"]
197 it "should not run the example" do
199 examples_that_were_run.should == ['should be run']
203 describe ExampleGroup, "#run when specified_examples does not match an Example description" do
205 examples_that_were_run = @examples_that_were_run
206 @example_group = Class.new(ExampleGroup) do
208 it("should be something else") do
209 examples_that_were_run << 'should be something else'
212 options.examples = ["does not match anything"]
215 it "should not run the example" do
217 examples_that_were_run.should == []
221 describe ExampleGroup, "#run when specified_examples matches an Example description" do
223 examples_that_were_run = @examples_that_were_run
224 @example_group = Class.new(ExampleGroup) do
226 it("should be run") do
227 examples_that_were_run << 'should be run'
229 it("should not be run") do
230 examples_that_were_run << 'should not be run'
233 options.examples = ["should be run"]
236 it "should run only the example, when there in only one" do
238 examples_that_were_run.should == ["should be run"]
241 it "should run only the one example" do
243 examples_that_were_run.should == ["should be run"] end
247 describe ExampleGroup, "#run with success" do
249 @special_example_group = Class.new(ExampleGroup)
250 ExampleGroupFactory.register(:special, @special_example_group)
251 @not_special_example_group = Class.new(ExampleGroup)
252 ExampleGroupFactory.register(:not_special, @not_special_example_group)
256 ExampleGroupFactory.reset
259 it "should send reporter add_example_group" do
261 reporter.example_groups.should == [example_group]
264 it "should run example on run" do
266 example_group.it("should") {example_ran = true}
268 example_ran.should be_true
271 it "should run before(:all) block only once" do
272 before_all_run_count_run_count = 0
273 example_group.before(:all) {before_all_run_count_run_count += 1}
274 example_group.it("test") {true}
275 example_group.it("test2") {true}
277 before_all_run_count_run_count.should == 1
280 it "should run after(:all) block only once" do
281 after_all_run_count = 0
282 example_group.after(:all) {after_all_run_count += 1}
283 example_group.it("test") {true}
284 example_group.it("test2") {true}
286 after_all_run_count.should == 1
287 @reporter.rspec_verify
290 it "after(:all) should have access to all instance variables defined in before(:all)" do
291 context_instance_value_in = "Hello there"
292 context_instance_value_out = ""
293 example_group.before(:all) { @instance_var = context_instance_value_in }
294 example_group.after(:all) { context_instance_value_out = @instance_var }
295 example_group.it("test") {true}
297 context_instance_value_in.should == context_instance_value_out
300 it "should copy instance variables from before(:all)'s execution context into spec's execution context" do
301 context_instance_value_in = "Hello there"
302 context_instance_value_out = ""
303 example_group.before(:all) { @instance_var = context_instance_value_in }
304 example_group.it("test") {context_instance_value_out = @instance_var}
306 context_instance_value_in.should == context_instance_value_out
309 it "should not add global before callbacks for untargetted example_group" do
312 ExampleGroup.before(:all) { fiddle << "Example.before(:all)" }
313 ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" }
314 @special_example_group.before(:each) { fiddle << "Example.before(:each, :type => :special)" }
315 @special_example_group.prepend_before(:each) { fiddle << "Example.prepend_before(:each, :type => :special)" }
316 @special_example_group.before(:all) { fiddle << "Example.before(:all, :type => :special)" }
317 @special_example_group.prepend_before(:all) { fiddle << "Example.prepend_before(:all, :type => :special)" }
319 example_group = Class.new(ExampleGroup) do
320 describe("I'm not special", :type => :not_special)
325 'Example.prepend_before(:all)',
326 'Example.before(:all)',
330 it "should add global before callbacks for targetted example_groups" do
333 ExampleGroup.before(:all) { fiddle << "Example.before(:all)" }
334 ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" }
335 @special_example_group.before(:each) { fiddle << "special.before(:each, :type => :special)" }
336 @special_example_group.prepend_before(:each) { fiddle << "special.prepend_before(:each, :type => :special)" }
337 @special_example_group.before(:all) { fiddle << "special.before(:all, :type => :special)" }
338 @special_example_group.prepend_before(:all) { fiddle << "special.prepend_before(:all, :type => :special)" }
339 @special_example_group.append_before(:each) { fiddle << "special.append_before(:each, :type => :special)" }
341 example_group = Class.new(@special_example_group).describe("I'm a special example_group") {}
342 example_group.it("test") {true}
345 'Example.prepend_before(:all)',
346 'Example.before(:all)',
347 'special.prepend_before(:all, :type => :special)',
348 'special.before(:all, :type => :special)',
349 'special.prepend_before(:each, :type => :special)',
350 'special.before(:each, :type => :special)',
351 'special.append_before(:each, :type => :special)',
355 it "should order before callbacks from global to local" do
357 ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" }
358 ExampleGroup.before(:all) { fiddle << "Example.before(:all)" }
359 example_group.prepend_before(:all) { fiddle << "prepend_before(:all)" }
360 example_group.before(:all) { fiddle << "before(:all)" }
361 example_group.prepend_before(:each) { fiddle << "prepend_before(:each)" }
362 example_group.before(:each) { fiddle << "before(:each)" }
365 'Example.prepend_before(:all)',
366 'Example.before(:all)',
367 'prepend_before(:all)',
369 'prepend_before(:each)',
374 it "should order after callbacks from local to global" do
376 example_group.after(:each) { fiddle << "after(:each)" }
377 example_group.append_after(:each) { fiddle << "append_after(:each)" }
378 example_group.after(:all) { fiddle << "after(:all)" }
379 example_group.append_after(:all) { fiddle << "append_after(:all)" }
380 ExampleGroup.after(:all) { fiddle << "Example.after(:all)" }
381 ExampleGroup.append_after(:all) { fiddle << "Example.append_after(:all)" }
385 'append_after(:each)',
387 'append_after(:all)',
388 'Example.after(:all)',
389 'Example.append_after(:all)'
393 it "should have accessible instance methods from included module" do
394 mod1_method_called = false
396 define_method :mod1_method do
397 mod1_method_called = true
401 mod2_method_called = false
403 define_method :mod2_method do
404 mod2_method_called = true
408 example_group.include mod1, mod2
410 example_group.it("test") do
415 mod1_method_called.should be_true
416 mod2_method_called.should be_true
419 it "should include targetted modules included using configuration" do
423 Spec::Runner.configuration.include(mod1, mod2)
424 Spec::Runner.configuration.include(mod3, :type => :not_special)
426 example_group = Class.new(@special_example_group).describe("I'm special", :type => :special) do
431 example_group.included_modules.should include(mod1)
432 example_group.included_modules.should include(mod2)
433 example_group.included_modules.should_not include(mod3)
436 it "should include any predicate_matchers included using configuration" do
437 $included_predicate_matcher_found = false
438 Spec::Runner.configuration.predicate_matchers[:do_something] = :does_something?
439 example_group = Class.new(ExampleGroup) do
441 it "should respond to do_something" do
442 $included_predicate_matcher_found = respond_to?(:do_something)
446 $included_predicate_matcher_found.should be(true)
449 it "should use a mock framework set up in config" do
453 $included_module = mod
457 def teardown_mocks_for_rspec
463 $included_module = nil
465 Spec::Runner.configuration.mock_with mod
467 example_group = Class.new(ExampleGroup) do
473 $included_module.should_not be_nil
474 $torn_down.should == true
476 Spec::Runner.configuration.mock_with :rspec
481 describe ExampleGroup, "#run with pending example that has a failing assertion" do
483 example_group.it("should be pending") do
484 pending("Example fails") {false.should be_true}
488 it "should send example_pending to formatter" do
489 @formatter.should_receive(:example_pending).with("example", "should be pending", "Example fails")
494 describe ExampleGroup, "#run with pending example that does not have a failing assertion" do
495 it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
498 example_group.it("should be pending") do
499 pending("Example passes") {true.should be_true}
503 it "should send example_pending to formatter" do
504 @formatter.should_receive(:example_pending).with("example", "should be pending", "Example passes")
509 describe ExampleGroup, "#run when before(:all) fails" do
510 it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
513 ExampleGroup.before(:all) { raise NonStandardError, "before(:all) failure" }
516 it "should not run any example" do
518 example_group.it("test") {spec_ran = true}
520 spec_ran.should be_false
523 it "should run ExampleGroup after(:all)" do
524 after_all_ran = false
525 ExampleGroup.after(:all) { after_all_ran = true }
527 after_all_ran.should be_true
530 it "should run example_group after(:all)" do
531 after_all_ran = false
532 example_group.after(:all) { after_all_ran = true }
534 after_all_ran.should be_true
537 it "should supply before(:all) as description" do
538 @reporter.should_receive(:failure) do |example, error|
539 example.description.should eql("before(:all)")
540 error.message.should eql("before(:all) failure")
543 example_group.it("test") {true}
548 describe ExampleGroup, "#run when before(:each) fails" do
549 it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
552 ExampleGroup.before(:each) { raise NonStandardError }
555 it "should run after(:all)" do
556 after_all_ran = false
557 ExampleGroup.after(:all) { after_all_ran = true }
559 after_all_ran.should be_true
563 describe ExampleGroup, "#run when any example fails" do
564 it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
567 example_group.it("should") { raise NonStandardError }
570 it "should run after(:all)" do
571 after_all_ran = false
572 ExampleGroup.after(:all) { after_all_ran = true }
574 after_all_ran.should be_true
578 describe ExampleGroup, "#run when first after(:each) block fails" do
579 it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
582 class << example_group
583 attr_accessor :first_after_ran, :second_after_ran
585 example_group.first_after_ran = false
586 example_group.second_after_ran = false
588 example_group.after(:each) do
589 self.class.second_after_ran = true
591 example_group.after(:each) do
592 self.class.first_after_ran = true
597 it "should run second after(:each) block" do
598 reporter.should_receive(:example_finished) do |example, error|
599 example.should equal(example)
600 error.message.should eql("first")
603 example_group.first_after_ran.should be_true
604 example_group.second_after_ran.should be_true
608 describe ExampleGroup, "#run when first before(:each) block fails" do
609 it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
612 class << example_group
613 attr_accessor :first_before_ran, :second_before_ran
615 example_group.first_before_ran = false
616 example_group.second_before_ran = false
618 example_group.before(:each) do
619 self.class.first_before_ran = true
622 example_group.before(:each) do
623 self.class.second_before_ran = true
627 it "should not run second before(:each)" do
628 reporter.should_receive(:example_finished) do |name, error|
629 error.message.should eql("first")
632 example_group.first_before_ran.should be_true
633 example_group.second_before_ran.should be_false
637 describe ExampleGroup, "#run when failure in after(:all)" do
638 it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
641 ExampleGroup.after(:all) { raise NonStandardError, "in after(:all)" }
644 it "should return false" do
645 example_group.run.should be_false
650 class ExampleSubclass < ExampleGroup
653 describe ExampleGroup, "subclasses" do
655 ExampleGroupFactory.reset
658 it "should have access to the described_type" do
659 example_group = Class.new(ExampleSubclass) do
662 example_group.send(:described_type).should == Array
665 it "should concat descriptions when nested" do
666 example_group = Class.new(ExampleSubclass) do
668 $nested_group = describe("when empty") do
671 $nested_group.description.to_s.should == "Array when empty"
675 describe Enumerable do
677 ["4", "2", "1"].each(&block)
680 it "should be included in examples because it is a module" do
681 map{|e| e.to_i}.should == [4,2,1]
685 describe "An", Enumerable, "as a second argument" do
687 ["4", "2", "1"].each(&block)
690 it "should be included in examples because it is a module" do
691 map{|e| e.to_i}.should == [4,2,1]
695 describe Enumerable do
696 describe "as the parent of nested example groups" do
697 it "should be included in examples because it is a module" do
698 pending("need to make sure nested groups know the described type") do
699 map{|e| e.to_i}.should == [4,2,1]
706 it"should not be included in examples because it is not a module" do
707 lambda{self.map}.should raise_error(NoMethodError, /undefined method `map' for/)