Expectation ordering


#1

Hi

Can I still rely on this RSpec behaviour?

I’ve got a spec for a TCP socket client:

   it "should do things in a sane order" do
     @socket.should_receive(:write) do
       @socket.should_receive(:read) do
         @socket.should_receive(:close)
       end
     end
     @client.update_news_feeds
   end

But this passes, where I was expecting it to fail:

 def update_news_feeds
   socket = TCPSocket.new(@server, @port)
   socket.read
   socket.write("UPDATE\n")
   socket.close
 end

Has this form of expectation ordering been removed?

Thanks
Ashley


http://www.patchspace.co.uk/


#2

On Tue, Oct 7, 2008 at 7:59 AM, Ashley M.
removed_email_address@domain.invalid wrote:

     end
 socket.close

end

Has this form of expectation ordering been removed?

As far as I know this form of expectation ordering was never
supported. If you’ve seen documentation that suggests it should be,
please point me to it so I can resolve the discrepancy.

Ordering in rspec mocks is managed with the #ordered method:

@socket.should_receive(:write).ordered
@socket.should_receive(:read).ordered
@socket.should_receive(:close).ordered

See http://rspec.info/documentation/mocks/message_expectations.html -
almost all the way down the page.

Cheers,
David


#3

On 7 Oct 2008, at 15:15, David C. wrote:

As far as I know this form of expectation ordering was never
supported. If you’ve seen documentation that suggests it should be,
please point me to it so I can resolve the discrepancy.

Aslak told me himself… on this list :o)

Ordering in rspec mocks is managed with the #ordered method:

@socket.should_receive(:write).ordered
@socket.should_receive(:read).ordered
@socket.should_receive(:close).ordered

I forgot about that. When I asked on the list before it was because I
needed a way to do inter-mock ordering. Thanks for the link, it
solved the problem in the example I gave. Unfortunately looks like
I’ve lost the ability to do this:

   it "should migrate the database (after initialising it)" do
     DataMapper.should_receive(:setup) do
       Database::Migrator.should_receive(:migrate_up!)
     end
     @server.start
   end

Maybe I was the only person taking advantage of this?

Ashley


http://www.patchspace.co.uk/


#4

On Tue, Oct 7, 2008 at 9:40 AM, Ashley M.
removed_email_address@domain.invalid wrote:

Ordering in rspec mocks is managed with the #ordered method:
it “should migrate the database (after initialising it)” do
DataMapper.should_receive(:setup) do
Database::Migrator.should_receive(:migrate_up!)
end
@server.start
end

Maybe I was the only person taking advantage of this?

Is the block no longer being executed? If so, then we have a problem
:slight_smile: Please report this at http://rspec.lighthouseapp.com.

Thanks,
David


#5

On 7 Oct 2008, at 15:55, David C. wrote:

Is the block no longer being executed? If so, then we have a problem
:slight_smile: Please report this at http://rspec.lighthouseapp.com.

Bizarrely, my little test…

require ‘spec’

describe “Blocks” do
it “should be called” do
b = mock(Object)

   b.should_receive(:this) do
     b.should_receive(:that)
   end

   b.that
   b.this
 end

end

Works as expected (the above fails)

I’ll have to investigate further…

Ashley


http://www.patchspace.co.uk/