On Wed, Mar 5, 2008 at 12:28 PM, Rick DeNatale <[EMAIL PROTECTED]> wrote:
> I'm wanting to write a spec that a model is applying an :order option
>  to a find call, but I don't want to completely specify all of the find
>  parameters.
>
>  So I want to write something like this, say in a controller spec
>
>    User.should_receive(:find).with(:all, hash_with_at_least(:order =>
>  'user.name ASC'))
>    get 'index', :sort => 'up'
>
>  This ability to partially specify the contents of a hash argument
>  seems to be generally useful, particularly for Rails, and was
>  wondering if anyone had done this. I don't think it would be too hard.

And by the way, here's my sketch of how to do this, just looking not
to reinvent the wheel:

class HashWithAtLeast

  def initialize(aHash)
    @expected = aHash
  end

  def ==(other)
    @expected.each do |key, value|
      return false unless other[key] == value
    end
    true
  end

  def to_s
    "Hash with at least (@expected.inspect)"
  end
end

def hash_with_at_least(hash)
  HashWithAtLeast.new(hash)
end

describe HashWithAtLeast do
  it "should match the same hash" do
    hash_with_at_least(:a => 2).should == {:a => 2}
  end

  it "should match a hash with an extra key/value" do
    hash_with_at_least(:a => 2).should == {:a => 2, :b => 3}
  end

  it "should not match a hash with a missing key" do
    hash_with_at_least(:a => 2).should_not == {:b => 2}
    hash_with_at_least(:a => 2, :b => 3).should_not == {:a => 2}
  end

  it "should not match a hash with the wrong value for a key" do
    hash_with_at_least(:a => 2).should_not == {:a => 3}
    hash_with_at_least(:a => 2, :b => 3).should_not == {:a => 0, :b => 3}
  end

end

describe HashWithAtLeast, "in a message expectation" do
  before(:all) do
    @foo = Object.new
  end

  it "should match exact" do
    @foo.should_receive(:bar).with(hash_with_at_least(:a => 2))
    @foo.bar(:a => 2)
  end

  it "should allow extra keys" do
    @foo.should_receive(:bar).with(hash_with_at_least(:a => 2))
    @foo.bar(:a => 2, :b => 3)
  end
end

-- 
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to