[rspec-users] Can I do foo.should (be_nil || be_empty) in rspec
Andrew Premdas
apremdas at gmail.com
Tue Nov 4 11:20:58 EST 2008
Ashley,
Thanks for your time on this, the reply does make sense, and I can see from
an OO point of view that any particular object being (foo||bar) is
equivalent to that object being baz. However with the dynamic nature of ruby
we often don't know what object we are going to be dealing with in our
tests/specs. Whilst a unit test will generally (always?) be aimed at a
particular type, when implementing a plain text feature/story we are often
working at a much higher level. In these cases the (foo || bar) construct
could mean different types and a baz might not exist or be particularly easy
to represent or formulate.
I can see that wanting this construct, could indicate a smell maybe a badly
worded story - i.e. a conjunction step.
All best
Andrew
2008/11/4 Ashley Moran <ashley.moran at patchspace.co.uk>
>
> On 4 Nov 2008, at 12:45, Andrew Premdas wrote:
>
> General case I'm thinking about is just testing that something should be
>> one thing or another
>>
>> e.g x.should be(foo || bar)
>>
>> Haven't got a specific example at the moment apart from the blank one.
>> What I'm thinking about is the syntax to say this in a spec, as I think
>> there must be lots of times when having this sort of syntax would be useful.
>>
>
> Hi Andrew
>
> I suspect that in general the concept of an object O being (foo || bar)
> actually means there's a rule that makes your object baz instead. The
> reason is that if you spec foo and bar independently, you double the number
> of contexts for objects that depend on O.
>
> So this might not look to bad:
>
> describe MyObject do
> before(:each) do
> @o = MyObject.new
> end
>
> it "should be foo or bar" do
> @o.should be_foo_or_bar
> end
> end
>
> but it means everywhere else you're forced to duplicate that logic, eg:
>
> describe MyOtherObject do
> describe "when its MyObject is foo" do
> before(:each) do
> o = mock(MyObject, :foo => true, :bar => false)
> @oo = MyOtherObject.new(o)
> end
> it "should be faz" do
> @oo.should be_faz
> end
> end
>
> describe "when its MyObject is bar" do
> before(:each) do
> o = mock(MyObject, :foo => false, :bar => true)
> @oo = MyOtherObject.new(o)
> end
> it "should be faz" do
> @oo.should be_faz
> end
> end
>
> describe "when its MyObject is neither foo nor bar" do
> before(:each) do
> o = mock(MyObject, :foo => false, :bar => false)
> @oo = MyOtherObject.new(o)
> end
> it "should not be faz" do
> @oo.should_not be_faz
> end
> end
> end
>
> instead of just:
>
> describe MyOtherObject do
> describe "when its MyObject is baz" do
> before(:each) do
> o = mock(MyObject, :baz => true)
> @oo = MyOtherObject.new(o)
> end
> it "should be faz" do
> @oo.should be_faz
> end
> end
>
> describe "when its MyObject is not baz" do
> before(:each) do
> o = mock(MyObject, :baz => false)
> @oo = MyOtherObject.new(o)
> end
> it "should not be faz" do
> @oo.should_not be_faz
> end
> end
> end
>
> s/foo/nil/
> s/bar/empty/
> s/baz/blank/
>
> This make sense? Sorry if it's a bit abstract, or has typos. I didn't
> actually run that code, of course...
>
> I think in summary, two branches in your specs => you are violating Tell
> Don't Ask (somewhere else) in your code.
>
>
> Ashley
>
> --
> http://www.patchspace.co.uk/
> http://aviewfromafar.net/
>
>
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081104/cf44c389/attachment.html>
More information about the rspec-users
mailing list