On Fri, Sep 18, 2009 at 11:31 AM, Yi Wen <hayafi...@gmail.com> wrote:
> Ok, I guess in reality it will never make a difference if a predicate
> returns a nil or a false.
>
> The behavior annoys me a little bit when I write a test that passes when the
> method itself does nothing (so that it returns nil). Any thoughts?

Remember that each example runs _in a context_. Any one example need
not tell the whole story, but a mere part of it. If an example says
"thing.should_not have_foo" and thing#has_foo? doesn't do anything,
then that's all the implementation that is necessary for _that
example_ to pass. But that shouldn't be the only example. Consider:

describe Thing do
  context "without foo" do
    it "says it does not have foo" do
      thing = Thing.new
      thing.should_not have_foo
    end
  end

  context "with foo" do
    it "says it has foo" do
      thing = Thing.new.with_foo
      thing.should have_foo
    end
  end
end

The first example will pass with an empty #has_foo? method, but the
second one won't. Together they tell a more complete story.

If, considering the above, this continues to bother you, then write an
explicit example:

thing.has_xxx?.should_not == nil

HTH,
David

>
> Thanks
>
> Yi
>
>
> On Sep 18, 2009, at 11:06 AM, David Chelimsky wrote:
>
>> On Fri, Sep 18, 2009 at 10:42 AM, Yi Wen <hayafi...@gmail.com> wrote:
>>>
>>> Hi all,
>>>
>>> I noticed that if I have a method named has_somthing? and I do:
>>> object.should_not have_somthing and it failed (as expected) when the
>>> method
>>> returns nil.
>>
>> Actually, this should pass. The have_xxx and be_xxx matchers should
>> pass/fail based on truthiness, not true/false explicitly. For example:
>>
>>>> require 'ostruct'
>>
>> => true
>>>>
>>>> require 'spec/expectations'
>>
>> => true
>>>>
>>>> include Spec::Matchers
>>
>> => Object
>>>>
>>>> obj = OpenStruct.new(:has_foo? => nil)
>>
>> => #<OpenStruct has_foo?=nil>
>>>>
>>>> obj.has_foo?
>>
>> => nil
>>>>
>>>> obj.should_not have_foo
>>
>> => nil
>>>>
>>>> obj.should have_foo
>>
>> Spec::Expectations::ExpectationNotMetError: expected #has_foo?(nil) to
>> return true, got false
>>
>> The message is admittedly wrong (should say "got nil" at the end, or
>> something else entirely), but the pass/fail is correct.
>>
>> So it sounds like you're experiencing a bug of some kind on the
>> has_xxx matcher, not the be_xxx matcher, which is appears to be
>> behaving correctly based on what you wrote below. Please file a bug if
>> you can provide an example that I can run that I can see behaving
>> incorrectly.
>>
>> HTH,
>> David
>>
>>
>>
>>
>>>
>>> But if the method is something? and I do:
>>> object.should_not be_something, and it succeeded (not what I expected)
>>> when
>>> something? returns nil
>>>
>>> Is this intended behavior or something I did was wrong? Thanks
>>
>>
>>
>>
>>>
>>> Yi
>>> _______________________________________________
>>> rspec-users mailing list
>>> rspec-users@rubyforge.org
>>> http://rubyforge.org/mailman/listinfo/rspec-users
>>>
>> _______________________________________________
>> rspec-users mailing list
>> rspec-users@rubyforge.org
>> http://rubyforge.org/mailman/listinfo/rspec-users
>
> _______________________________________________
> rspec-users mailing list
> rspec-users@rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to