On Sep 24, 2010, at 1:29 PM, GregD wrote:
> Hi all,
>
> Newbie here and I'm using rspec with jruby to test a java class, but
> this is more of a rspec question.
>
> I have a java HashMap object and want to make sure a key exists. I
> have this as my test:
>
> context :toHashMap do
> subject { @var_list.toHashMap }
>
> it { should satisfy{|a| a.contains_key?(var1) } }
> it { should satisfy{|a| a.contains_key?(var2) } }
> it { should satisfy{|a| a.contains_key?(var3) } }
> end
>
> @var_list is set to another java object that has a method toHashMap
> that returns
> a HashMap. var1, var2 and var3 are set using let(:var1), etc. If the
> one of
> these fails, I get this telling me that I need to supply a description
> method:
>
> 'Java::LibraryLanguage::XmlVariableList when added duplicate variables
> with different values toHashMap should When you call a matcher in an
> example without a String, like this:
>
> specify { object.should matcher }
>
> or this:
>
> it { should matcher }
>
> RSpec expects the matcher to have a #description method. You should
> either
> add a String to the example this matcher is being used in, or give it
> a
> description method. Then you won't have to suffer this lengthy warning
> again.
> ' FAILED
> expected {var01=2, var02=this-is-a-string} to satisfy block
> <<<<<<<
>
>
> I'd like to put 'contain the key <blah>' in place of 'When you call a
> matcher in
> an example without a String'
>
> Where do I put that string? I thought I could just do:
>
> it "should contain the key #{var1}" { should satisify{|a|
> a.contains_key?(var1)
> } }
>
> But, the loading complains on that. Where can a put a custom
> description into
> this code (easily/polite way).
Congratulations - you're apparently the first person to ever use the satisfy
matcher with an implicit subject, and have uncovered a bug!
http://github.com/rspec/rspec-expectations/issues/issue/20
I'd recommend not using that satisfy matcher for this case though, as it's
really intended to be more of a last resort, and you can do much better with a
custom matcher:
RSpec::Matchers.define :contain_key do |key|
match do |subject|
subject.contains_key?(key)
end
end
Then you can say:
context :toHashMap do
subject { @var_list.toHashMap }
it { should contain_key(var1) }
it { should contain_key(var2) }
it { should contain_key(var3) }
end
More info on custom matchers:
http://github.com/rspec/rspec-expectations/blob/master/features/matchers/define_matcher.feature
HTH,
David
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users