Patrick J. Collins
2011-Nov-29 20:32 UTC
[rspec-users] is there a convention for testing that a record exists?
In the app I am working on, there are a lot of observers for various models which call Event.create! to log stuff... So within a particular example, various records might be created in order to test behavior-- and this would result in several events being created. So say, I have a spec that does: it "creates an event when sharing a post" do user = create_user # this will make an event record of type "user created" post = create_post(:user => user) # this will make an event record of type "post created" post.share! # check to see that Event has a "post shared" event end ... Normally I would just do Event.last.event_type.should == "post shared" However, if the Event model has it''s default_scope set to order records in a certain way, that test might fail. So I could do: Event.unscoped.last.event_type.should == "post shared" But then I begin thinking maybe it should be more like this: it "creates an event when sharing a post" do Event.exists?(:event_type => "post shared").should be_false user = create_user # this will make an event record of type "user created" post = create_post(:user => user) # this will make an event record of type "post created" post.share! Event.exists?(:event_type => "post shared").should be_true end ... I''m just not sure what''s the best way to go, and if there''s a convention for this sort of thing? Patrick J. Collins http://collinatorstudios.com
David Chelimsky
2011-Nov-30 03:19 UTC
[rspec-users] is there a convention for testing that a record exists?
On Nov 29, 2011, at 2:32 PM, Patrick J. Collins wrote:> In the app I am working on, there are a lot of observers for various models > which call Event.create! to log stuff... So within a particular example, > various records might be created in order to test behavior-- and this would > result in several events being created. > > So say, I have a spec that does: > > it "creates an event when sharing a post" do > user = create_user # this will make an event record of type "user created" > post = create_post(:user => user) # this will make an event record of type "post created" > post.share! > > # check to see that Event has a "post shared" event > end > > ... > > Normally I would just do Event.last.event_type.should == "post shared" > > However, if the Event model has it''s default_scope set to order records in a > certain way, that test might fail. > > So I could do: > > Event.unscoped.last.event_type.should == "post shared" > > But then I begin thinking maybe it should be more like this: > > it "creates an event when sharing a post" do > Event.exists?(:event_type => "post shared").should be_false > > user = create_user # this will make an event record of type "user created" > post = create_post(:user => user) # this will make an event record of type "post created" > post.share! > > Event.exists?(:event_type => "post shared").should be_true > end > > ... I''m just not sure what''s the best way to go, and if there''s a convention > for this sort of thing?I''m not aware of a solid convention for this. I tend to avoid the pairing of the 1st and last lines of the 2nd example. Are the events associated to the posts at all? If so you could specify post.events.map(&:event_type).should include("post shared") or some such.