Hi Zach,

On 13.07.2008, at 17:59, Zach Dennis wrote:
You want cross mock ordering! I've wanted this in RSpec in the past as well. The only ruby-based mocking library I know of that does this is Hardmock. It looks like its RDoc now has instructions for it to work with RSpec:

http://hardmock.rubyforge.org/

Thanks for the suggestion!

To be honest, I'm not eager to add another library. Ashley's approach seems to work fine and I only need it in a couple of specs.





Zach

On Sun, Jul 13, 2008 at 11:35 AM, Sven Fuchs <[EMAIL PROTECTED] > wrote:
On 13.07.2008, at 17:01, Sven Fuchs wrote:

On 13.07.2008, at 16:41, David Chelimsky wrote:

On Sun, Jul 13, 2008 at 9:32 AM, Pat Maddox <[EMAIL PROTECTED]> wrote:
On Sun, Jul 13, 2008 at 9:49 AM, Sven Fuchs <[EMAIL PROTECTED] > wrote:
I've been wondering how to expect arbitrary methods being called in a
particular order. The RSpec documentation for expecting method calls on mock objects mentions that it is possible to pass a block to #should_receive, but does not mention that it can be used to track the method call order pretty
easily:

http://www.artweb-design.de/2008/7/13/expecting-arbitrary-method-calls-in-a-particular-order-in-rspec

Is there a better way of doing this?

If not, do you think it would make sense to add this to the RSpec docs?
http://rspec.info/documentation/mocks/message_expectations.html

Hey Sven,

Mock objects have an optional notion of ordering. Check out the following spec:

describe "a mock object" do
it "should expect ordered messages" do
 foo = mock("ordered mock")
 foo.should_receive(:first).ordered
 foo.should_receive(:second).ordered
 foo.should_receive(:third).ordered

 foo.first
 foo.second
 foo.third
end
end

Changing the order in which they're called will raise an ExpectationNotMetError.

Sven, FYI - this is explained on the page you mentioned:
http://rspec.info/documentation/mocks/message_expectations.html

Hey guys, thanks for the quick answers :)

Maybe I was not clear enough about what I wanted to spec. Or I actually do not understand what #ordered does.

In Pat's spec above the methods #first, #second and #third are called on the same object foo and the spec defines the order. That's kind of the opposite of my usecase. I wanted to specify that the a method #run (or whatever) is called on *different* objects in a particular order. Like:

filter_1 = mock('filter_1')
filter_2 = mock('filter_2')
filter_chain << filter_1
filter_chain << filter_2

Now, when the filter_chain is run I want to expect that the filters are run in the order they were added to the chain:

filter_chain.run
methods_called_on_individual_filters.should == ['filter_1#run', 'filter_2#run'] # pseudo-code

If that's possible somehow with should_receive(:run).ordered than at least it's not very clear from that docs page which only talks about expecting the order of methods being called on the same mock, not on different mocks. ("There are times when you want to specify the order of messages sent to *a* mock")

Am I missing something?

Maybe it's bit more clear this way:

class Chain < Array
 def run
   each{|object| object.run}
 end
end

describe "Expecting the order of methods being called on arbitrary objects" do
 it "works" do
   first = mock('first')
   second = mock('second')

   chain = Chain.new
   chain << first
   chain << second

   second.should_receive(:run).ordered
   first.should_receive(:run).ordered
   chain.run
 end
end

This passes, of course.

I'd want to to specify that first#run is run first and second#run is run second though and I think I can't do that with should_receive.ordered



--
sven fuchs                      [EMAIL PROTECTED]
artweb design           http://www.artweb-design.de
grünberger 65           + 49 (0) 30 - 47 98 69 96 (phone)
d-10245 berlin          + 49 (0) 171 - 35 20 38 4 (mobile)



_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users



--
Zach Dennis
http://www.continuousthinking.com _______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

--
sven fuchs                      [EMAIL PROTECTED]
artweb design           http://www.artweb-design.de
grünberger 65           + 49 (0) 30 - 47 98 69 96 (phone)
d-10245 berlin          + 49 (0) 171 - 35 20 38 4 (mobile)



_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to