On Mar 28, 2008, at 1:46 PM, David Chelimsky wrote: > On Fri, Mar 28, 2008 at 1:38 PM, Chuck Remes > <[EMAIL PROTECTED]> wrote: >> I'm trying to use a mock to return a hash so that #each_pair can >> process it. I can't get it to work. Whatever I return to #each_pair >> is >> ignored and the block never gets executed. Here's an example >> illustrating the problem. >> >> require File.join(File.dirname(__FILE__), %w[spec_helper]) >> >> class MyExample >> attr_reader :result >> >> def example(data) >> data.each_pair do |key, value| >> @result = {key => value} >> end >> end >> end >> >> describe MyExample, "mock#each_pair fails" do >> it "should return a hash after processing the mock using each_pair" >> do >> sample_mock = mock("sample") >> real_hash = {:key => :value} >> sample_mock.should_receive(:each_pair).once.and_return(real_hash) >> obj = MyExample.new >> obj.example(sample_mock) >> obj.result.should == real_hash >> end >> end > > each_pair does not return the hash, it yields it to a block. Try this: > > sample_mock.should_receive(:each_pair).once.and_yield(real_hash)
Dave, thanks for the hint. That almost worked but I got this error: Spec::Mocks::MockExpectationError in 'MyExample mock#each_pair fails should return a hash after processing the mock using each_pair' Mock 'sample' yielded |{:key=>:value}| to block with arity of 2 Changing it slightly allowed it to work correctly: describe MyExample, "mock#each_pair fails" do it "should return a hash after processing the mock using each_pair" do sample_mock = mock("sample") real_hash = {:key => :value} sample_mock .should_receive(:each_pair).once.and_yield(real_hash.keys.first, real_hash.values.first) obj = MyExample.new obj.example(sample_mock) obj.result.should == real_hash end end Thanks for your help. SrBaker has been enriched as a result. :-) cr _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users