On Thu, Nov 15, 2012 at 10:23 AM, George Ogata <[email protected]> wrote: > Hi, > > I was hoping to reduce some repetitive verbosity in our specs, > and came across an attractive pattern. > > First, in a helper file: > > def when_subscribed(&block) > context "when user gets subscribed experience" do > before { current_user.stub(subscribed?: true) } > class_eval(&block) > end > end > > def when_unsubscribed(&block) > context "when user gets subscribed experience" do > before { current_user.stub(subscribed?: false) } > class_eval(&block) > end > end > > Then in our specs, stuff like: > > when_subscribed do > it "allows the user to access some page" do > ... > end > > ... > end > > This works of course, except it no longer lets us run these specs > via a line number on the command line, because RSpec considers > the spec defined in our helper file. > > In other words, the example group metadata says the file_path and > line_number correspond to the "context" lines in the > when_[un]subscribed definition.
That's because you're using class_eval. rspec already has a shared-context feature (similar to shared-examples) that will solve this for you: https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-context HTH, David > > The only solution I could find was a horrible brittle hack like: > > def shadow_context(name, options={}, &block) > first_caller_from_outside_rspec = caller.find { |line| line !~ > %r'/lib/rspec/core|/spec/support/' } > first_caller_from_outside_rspec =~ /(.+?):(\d+)(|:\d+)/ > file_path, line_number = $1, $2.to_i > context name do > metadata[:example_group][:file_path] = file_path > metadata[:example_group][:line_number] = line_number > class_eval(&block) > end > end > > And now change "context" to "shadow_context" in the helpers. > > Is there a better way to do this? > If not, would a better way to handle this be welcome in RSpec? > > Thanks! > George > > -- > You received this message because you are subscribed to the Google Groups > "rspec" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msg/rspec/-/hfyzcrp4E4gJ. > For more options, visit https://groups.google.com/groups/opt_out. > > -- You received this message because you are subscribed to the Google Groups "rspec" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit https://groups.google.com/groups/opt_out.
