Argument Constraints where the Argument is a Hash

Hi folks,

I have an object whose constructor I want to stub, specifying that it
should be passed a hash containing an expected set of key / value pairs.

Note that the actual hash might contain more key / value pairs, but I
don’t care, as long as my expected ones are there

I thought I might be able to write this:

       expected_params = {
         :page => "1",
         :city_id => city.id.to_s,
         :name => "thingy" }

Venue::Query.should_receive(:new).with( include
(expected_params) ).and_return(query)

… but it doesn’t seem to work.

What’s my best approach?

Thanks for your patience and support as I get up to speed with this
stuff folks. You’re all very kind!

cheers,
Matt

http://blog.mattwynne.net

In case you wondered: The opinions expressed in this email are my own
and do not necessarily reflect the views of any former, current or
future employers of mine.

Okay, I realised the with() is calling the == method on whatever you
pass in, so I did this:

   module EquateAnyHashContainingAllMyElements
     def ==(other)

       self.keys.all? do |key|
         other.has_key?(key)
       end

     end
   end

       expected_params = {
         :page => "1",
         :city_id => city.id.to_s,
         :name => name_filter }

       expected_params.extend(EquateAnyHashContainingAllMyElements)

       Venue::Query.should_receive(:new).with

( expected_params ).and_return(query)

Thoughts? Is there a neater way to do this? Be as brutal as you
like … :wink:

cheers,
Matt

http://blog.mattwynne.net

In case you wondered: The opinions expressed in this email are my own
and do not necessarily reflect the views of any former, current or
future employers of mine.

On Aug 18, 2008, at 11:10 AM, Matt W. [email protected] wrote:

      expected_params = {
        :page => "1",
        :city_id => city.id.to_s,
        :name => "thingy" }

Venue:
:Query.
should_receive(
:new).with( include(expected_params) ).and_return(query)

Close …

…with( hash_including(expected_params).and…

Cheers,
David