ben at benburkert.com
2007-Aug-06 21:25 UTC
[rspec-users] used the described Class in a shared behavior
Is it possible to access the described class in a shared behavior? I''m
trying to do something like this:
describe "Siberian feline", :shared => true do
described_class_instance_as :feline, :name => "fluffy", :breed
=>
"Siberian"
# or maybe
before(:all) do
@feline = described_class.new(:name => "fluffy", :breed =>
"Siberian")
end
it "should have long hair" do
@feline.should be_long_haired
end
end
describe SiberianCat, "(a subclass of, say, Cat)" do
it_should_behave_like "Siberian feline"
it "should purr" do
@feline.sound.should == "purr"
end
end
describe SiberianTiger, "(a subclass of BigCat)" do
it_should_behave_like "Siberian feline"
it "should roar" do
@feline.sound.should == "roar"
end
end
I''m looking for something more elegant than my current way, which is
like so:
describe "Siberian felines", :shared => true do
before(:all) do
@feline = @klass.new(:name => "fluffy", :breed =>
"Siberian")
end
it "should have long hair" do
@feline.should be_long_haired
end
end
describe SiberianCat, "(a subclass of, say, Cat)" do
it_should_behave_like "Siberian felines"
before(:all) do
@klass = SiberianCat
end
it "should purr" do
@feline.sound.should == "purr"
end
end
describe SiberianTiger, "(a subclass of BigCat)" do
it_should_behave_like "Siberian felines"
before(:all) do
@klass = SiberanTiger
end
it "should roar" do
@feline.sound.should == "roar"
end
end
Then again, i have a gut feeling that if i took better advantage of
modules it wouldn''t be an issue...
-Ben
David Chelimsky
2007-Aug-07 00:47 UTC
[rspec-users] used the described Class in a shared behavior
On 8/6/07, ben at benburkert.com <ben at benburkert.com> wrote:> Is it possible to access the described class in a shared behavior? I''m > trying to do something like this: > > describe "Siberian feline", :shared => true do > described_class_instance_as :feline, :name => "fluffy", :breed => > "Siberian" > > # or maybe > > before(:all) do > @feline = described_class.new(:name => "fluffy", :breed => "Siberian") > end > > it "should have long hair" do > @feline.should be_long_haired > end > end > > describe SiberianCat, "(a subclass of, say, Cat)" do > it_should_behave_like "Siberian feline" > > it "should purr" do > @feline.sound.should == "purr" > end > end > > describe SiberianTiger, "(a subclass of BigCat)" do > it_should_behave_like "Siberian feline" > > it "should roar" do > @feline.sound.should == "roar" > end > end > > > > I''m looking for something more elegant than my current way, which is like so: > > describe "Siberian felines", :shared => true do > before(:all) do > @feline = @klass.new(:name => "fluffy", :breed => "Siberian") > end > > it "should have long hair" do > @feline.should be_long_haired > end > end > > describe SiberianCat, "(a subclass of, say, Cat)" do > it_should_behave_like "Siberian felines" > > before(:all) do > @klass = SiberianCat > end > > it "should purr" do > @feline.sound.should == "purr" > end > end > > describe SiberianTiger, "(a subclass of BigCat)" do > it_should_behave_like "Siberian felines" > > before(:all) do > @klass = SiberanTiger > end > > it "should roar" do > @feline.sound.should == "roar" > end > end >The way you''re approaching it means that if something changes about the initializer for the SiberianTiger that doesn''t change for the initializer of the SiberianCat, you''re kinda screwed. I''d do it like this: http://pastie.caboo.se/85444 This keeps the shared behaviour very simple (all it needs is an instance variable) and puts control of the object you''re dealing with in the spec. WDYT?> > > > Then again, i have a gut feeling that if i took better advantage of > modules it wouldn''t be an issue... > > -Ben > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >
David Chelimsky
2007-Aug-07 00:51 UTC
[rspec-users] used the described Class in a shared behavior
On 8/6/07, David Chelimsky <dchelimsky at gmail.com> wrote:> On 8/6/07, ben at benburkert.com <ben at benburkert.com> wrote: > > Is it possible to access the described class in a shared behavior? I''m > > trying to do something like this: > > > > describe "Siberian feline", :shared => true do > > described_class_instance_as :feline, :name => "fluffy", :breed => > > "Siberian" > > > > # or maybe > > > > before(:all) do > > @feline = described_class.new(:name => "fluffy", :breed => "Siberian") > > end > > > > it "should have long hair" do > > @feline.should be_long_haired > > end > > end > > > > describe SiberianCat, "(a subclass of, say, Cat)" do > > it_should_behave_like "Siberian feline" > > > > it "should purr" do > > @feline.sound.should == "purr" > > end > > end > > > > describe SiberianTiger, "(a subclass of BigCat)" do > > it_should_behave_like "Siberian feline" > > > > it "should roar" do > > @feline.sound.should == "roar" > > end > > end > > > > > > > > I''m looking for something more elegant than my current way, which is like so: > > > > describe "Siberian felines", :shared => true do > > before(:all) do > > @feline = @klass.new(:name => "fluffy", :breed => "Siberian") > > end > > > > it "should have long hair" do > > @feline.should be_long_haired > > end > > end > > > > describe SiberianCat, "(a subclass of, say, Cat)" do > > it_should_behave_like "Siberian felines" > > > > before(:all) do > > @klass = SiberianCat > > end > > > > it "should purr" do > > @feline.sound.should == "purr" > > end > > end > > > > describe SiberianTiger, "(a subclass of BigCat)" do > > it_should_behave_like "Siberian felines" > > > > before(:all) do > > @klass = SiberanTiger > > end > > > > it "should roar" do > > @feline.sound.should == "roar" > > end > > end > > > > The way you''re approaching it means that if something changes about > the initializer for the SiberianTiger that doesn''t change for the > initializer of the SiberianCat, you''re kinda screwed. I''d do it like > this: http://pastie.caboo.se/85444 > > This keeps the shared behaviour very simple (all it needs is an > instance variable) and puts control of the object you''re dealing with > in the spec. > > WDYT?Also - side note - before(:each) is preferred over before(:all) because it''s better to be sure that each example starts with a clean slate. If one should change the state of the object you''re describing, you could end up with unexpected results and hair-pulling debugging sessions.> > > > > > > > > > Then again, i have a gut feeling that if i took better advantage of > > modules it wouldn''t be an issue... > > > > -Ben > > > > _______________________________________________ > > rspec-users mailing list > > rspec-users at rubyforge.org > > http://rubyforge.org/mailman/listinfo/rspec-users > > >