views:

53

answers:

1

When using a helper class with an rspec test, I can't see to use the .should be_false idiom. It's okay in a function defined in a helper .rb file, but when it's within a class the be_false symbol is not found. Example below -- why doesn't this work? How can I use be_false et al in a helper?

It seems possible that it's intentional that assertions like this only work in tests themselves. I have helpers which can fail due to eg. network comms problems which are actually bona-fide test failures since the network comms my helpers use are part of the system under test. How should I make my tests fail gracefully inside a helper class?

Results

$ spec ./test.rb 
helper_foo 1
helper_foo 2
helper_foo 3
FunctionFoo 1
F

1)
NameError in 'my_test should test that helper classes can use should be_false etc'
undefined local variable or method `be_false' for #<HelperFoo:0x2b265f7adc98>
./helper.rb:13:in `FunctionFoo'
./test.rb:13:

Finished in 0.004536 seconds

1 example, 1 failure

test.rb

require "helper.rb"

describe "my_test" do
    it "should test that helper classes can use should be_false etc" do

        (1 == 1).should be_true
        (2 == 1).should be_false

        helper_foo()

        instance = HelperFoo.new()
        instance.FunctionFoo
    end
  end

helper.rb

def helper_foo
    puts "helper_foo 1"
    (1==2).should be_false
    puts "helper_foo 2"
    (2==2).should be_true
    puts "helper_foo 3"
end

class HelperFoo
    def FunctionFoo
        puts "FunctionFoo 1"
        (1==2).should be_false
        puts "FunctionFoo 2"
        (2==2).should be_true
        puts "FunctionFoo 3"
    end
end
A: 

Expectations like be_true are only available in the context of an it block. When you call a method on HelperFoo.new, it's no longer executed in the context of whatever magical class it operates on.

You should read up on instance_eval to understand what an evaluation context is.

Also if you need to define RSpec examples externally, you should use Shared Example Groups (scroll down).

henning-koch
Thanks, that makes sense now.
kdt