Search code examples
rubytestingrspecstub

ruby rspec error "expected: 1 got: #<Proc:0x000000019155b8@/home


'Weight converter'

Trying to get the hang of using stubs but I can't get the format right, what do I have wrong? I know I already have the method in the code in this case but I am trying to learn how to do a stub correctly.

Test:

describe "Convert Pounds to Kilograms" do

it "should convert 3lb to 1kg" do
  weight = WeightConverter.stub!(:convert).with(3, 'lbs_to_kgs').and_return(1)
  weight.should == 1
end

Code:

class WeightConverter

  def self.convert(from, what_to_what)
    if what_to_what == 'lbs_to_kgs'
      (from / 2.2).truncate
    elsif what_to_what == 'kgs_to_lbs'
      (from * 2.2).truncate
    end
  end
end

fyi - this works (without stubs)

  it "should convert 91lbs to 41kgs" do
    weight = WeightConverter.convert(91, 'lbs_to_kgs')
    weight.should == 41
  end

Error:

Failures:

 1) Convert Pounds to Kilograms should convert 3lb to 1kg
     Failure/Error: weight.should == 1
       expected: 1
            got: #<Proc:0x000000010b0468@/home/durrantm/.rvm/gems/ruby-1.9.3-p125/gems/rspec-mocks-2.10.1/lib/rspec/mocks/message_expectation.rb:459 (lambda)> (using ==)
     # ./weight_converter_spec.rb:19:in `block (2 levels) in <top (required)>'

Finished in 0.00513 seconds
7 examples, 1 failure

Solution

  • You don't want to assign to the stub, rather you should be doing something like this:

    it "should convert 3lb to 1kg" do
      WeightConverter.stub!(:convert).with(3, 'lbs_to_kgs').and_return(1)
      weight = WeightConverter.convert(3, 'lbs_to_kgs')
      weight.should == 1
    end
    

    However, that's a fairly useless test -- the only thing it's testing is that your stub/mock library does what it's supposed to (i.e. it's not actually testing WeightConverter at all). Since you're directly testing the internals of WeightConverter, you don't need to stub it. You should be using actual values like in your second example. However, if WeightConverter depended on another class, you might stub that other class.