Forum: RSpec Custom Formatter: Getting Text from It Method

A3b6c2d0b2bafdb9ad9cdf782873204d?d=identicon&s=25 Jeff Nyman (Guest)
on 2011-09-30 20:00
(Received via mailing list)
Hey all.

I've been playing around with RSpec custom formatters to see how much
flexibility there is. One thing I've been trying to see is if I can
print the contents of a variable that's in an example (it) method. So,
for example, here's what I have in my specification:

  it "should display results range" do
    search_for("star wars")
    @browser.text.should match(/Showing .* of .* Results/)
    intent = "Text 'Showing .* of .* Results' shows after 'Star Wars'
search"
  end

Notice the line with intent there? I realize this is not what most
people would do with RSpec. The reason I'm doing this is because I'd
like viewers of the test results to see the exact condition that was
tested for in the should if they want to -- without having to read the
code. Again, I'm just experimenting.

What I'm trying to do is figure out how I could use a custom formatter
to print out that intent text. I know that the example_passed method
in the formatters contains elements like example.description that
prints out the text of the it method. But trying @output.puts
example.intent does not seem to work.

Is there a better way to do what I'm trying to do here? Again, I
realize that most people are happy with the describe and it text being
printed out. But sometimes people -- like my business users -- want to
check the actual condition that was checked for, without having to
read Ruby code.

Any pointers or tips would be greatly appreciated.

- Jeff
5d38ab152e1e3e219512a9859fcd93af?d=identicon&s=25 David Chelimsky (Guest)
on 2011-09-30 22:38
(Received via mailing list)
On Sep 28, 2011, at 7:30 AM, Jeff Nyman wrote:

>    intent = "Text 'Showing .* of .* Results' shows after 'Star Wars'
> to print out that intent text. I know that the example_passed method
> Any pointers or tips would be greatly appreciated.
>
> - Jeff

The variables defined inside the example are out of scope in the
formatter. You can do something like this:

==================
require 'rspec/core/formatters/base_text_formatter'

module ExtraDoc
  def example_passed(example)
    example.description << ": #{example.metadata[:extra_doc]}"
  end
end

RSpec::Core::Formatters::BaseTextFormatter.send(:include, ExtraDoc)

describe "something" do
  it "does something", :extra_doc => "with extra sauce" do
  end
end
==================

Output from `rspec --format documentation` is:

==================
something
  does something: with extra sauce
==================

That said, I'd focus on naming the examples better so they serve the
needs of all readers.

HTH,
David
5a0d7f0cb2fac7858d234de7f7f01491?d=identicon&s=25 Alex Chaffee (Guest)
on 2011-10-01 04:37
(Received via mailing list)
> The reason I'm doing this is because I'd
like viewers of the test results to see the exact condition that was
tested for in the should if they want to -- without having to read the
code.

Have you seen Wrong? You just described its intent :-)

http://github.com/sconover/wrong

If you get a source code block you can use the Chunk class in Wrong to
parse it and pull out useful snippets. But you probably won't have
access to the binding and its values at that point.

hth

 - A
This topic is locked and can not be replied to.