On Saturday, February 28, 2015 at 3:00:07 PM UTC-5, Myron Marston wrote: > > > > On Saturday, February 28, 2015 at 11:57:30 AM UTC-8, Myron Marston wrote: >> >> On Saturday, February 28, 2015 at 11:48:01 AM UTC-8, >> [email protected] wrote: >>> >>> Consider this (simplified) snippet. RSpec 3.1.7 >>> >>> RSpec.describe MyController, :type => :controller do >>> >>> describe "PUT #update" do >>> >>> before(:example) do >>> puts self.class #=> >>> RSpec::ExampleGroups::MyController::PUTUpdate >>> puts self.class.example.description #=> "example at >>> ./spec/controllers/my_controller_spec.rb:xxx" >>> puts self.class.example.full_description #=> "MyController PUT >>> update" >>> puts example.description #=> undefined local >>> variable or method 'example' >>> >>> end >>> >>> >>> it "should update things" do >>> puts self.class #=> >>> RSpec::ExampleGroups::MyController::PUTUpdate >>> puts self.class.example.description #=> "example at >>> ./spec/controllers/my_controller_spec.rb:xxx" >>> puts self.class.example.full_description #=> "MyController PUT >>> update" >>> puts example.description #=> undefined local >>> variable or method 'example' >>> end >>> end >>> end >>> >>> >>> I'm seeing some odd results when getting the metadata and description >>> values for examples. >>> >>> None of the Example instance methods work. Everything behaves as an >>> ExampleGroup. I'm not sure if this is intended. >>> >>> From the rspec-core README https://github.com/rspec/rspec-core#metadata >>> >>> >>> it "does something" do >>> expect(example.metadata[:description]).to eq("does something") >>> end >>> >>> This does not work. Am I doing something wrong? >>> >> >> Our README is out of date -- it was written against RSpec 2 but we have >> no tooling that validates its correctness and we forgot to update that >> example for the changes in RSpec 3. That's one advantage of the cukes -- >> they are self-validating and thus always correct :). >> >> Anyhow, in RSpec 3, we removed the `example` method, in favor of passing >> an arg to the `it`, `before`, `after`, `let`, etc. blocks: >> >> >> http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#dsl-methods-yield-the-example-as-an-argument >> >> So change `before(:example) do` to `before(:example) do |example|` and >> `it "..." do` to `it "..." do |example|` and it should work. >> >> Everything behaves as an ExampleGroup. I'm not sure if this is intended. >> >> >> It is. Every example is evaluated in the context of an instance of the >> example group class of which it is a part. This mirrors typical xUnit >> structure where you've got TestCase classes and tests are instance methods >> of those classes. This in turn provides us with the desired scoping and >> inheritance semantics that you'd want. Helper methods defined in the >> example group can be automatically called from within the `it` block >> without doing anything special to support that. >> >> The `example` object yielded to these methods is a special object that >> keeps track of the state of a particular example, exposing its metadata, >> its execution result, etc. >> >> HTH, >> Myron >> > > One other thing that's probably confusing there: when you call > `self.class.example` you are defining a new example. `it` is simply an > alias of `example`. That's why `self.class.example.description` has the > location rather than the description of the `it` example -- because you're > getting the description off of a new, anonymous example, so it is using the > location description as the example description. > > Myron >
Got it. Works as expected. Thanks! -- You received this message because you are subscribed to the Google Groups "rspec" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/rspec/5fd08772-9a0d-4855-870f-d0aa9e66fd46%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
