On Sep 27, 2010, at 8:05 AM, GregD wrote:
> On Sep 26, 6:37 pm, David Chelimsky <[email protected]> wrote:
>> 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/match...
>>
>> HTH,
>> David
> That helped a lot and I see it is a better/more polite 1-liner-way.
> Do you recommend that these custom matchers probably need to go into a
> spec helper for standard java classes and included since contains_key?
> (key) maps to the java HashMap method containsKey(key)? Do I put
> these in a ruby module to be included?
[I moved your responses to the bottom. Please use bottom or inline posting
rather than top posting. ]
The convention is to have a line like this in spec/spec_helper.rb:
Dir["./spec/support/**/*.rb"].each {|f| require f}
And then keep matchers and other support files under ./spec/support/
HTH,
David
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users