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@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users