On Mar 5, 2008, at 11:43 AM, "Rick DeNatale" <[EMAIL PROTECTED]>
wrote:
> 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'
I really like this idea. What about something more general that can
handle the first n args too?
>>
>>
>> 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
> [email protected]
> http://rubyforge.org/mailman/listinfo/rspec-users
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users