There is a seemingly very useful line of code in the cucumber wiki that I''d like to use: After do # Scenario teardown Database.truncate_all end (from http://github.com/aslakhellesoy/cucumber/wikis/migration-from-rspec-stories) But when I run this I get an uninitialized constant error for "Database". Anybody know if/how I can make this call? Is there something I need to require? Is there a different way of doing this now? I have a need to not use transactional_fixtures for a specific suite of tests and I want to clear out the database after every run so my tests are isolated. Thanks, Jeff
On Fri, Dec 5, 2008 at 6:32 AM, Jeff Talbot <jeff.a.talbot at gmail.com> wrote:> There is a seemingly very useful line of code in the cucumber wiki > that I''d like to use: > > After do > # Scenario teardown > Database.truncate_all > end >That''s just an example of some code you might call in an After. A little lower, you see TempFileManager.clean_up which also looks like non-Rails/Cucumber code. A simple way to achieve the former would be class Database def self.truncate TheModel.destroy_all TheOtherModel.destroy_all # etc end end destroy_all isn''t exactly the same as SQL TRUNCATE, but it might serve your purpose. ///ark -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081205/b21ca7df/attachment.html>
ISTR that "destroy_all" will instantiate each object, before destroying it. If you just want to clean the database, I think "delete_all" is the one you want (it just does a "delete from [table]", if memory serves), and should be a lot quicker. David 2008/12/6 Mark Wilden <mark at mwilden.com>:> On Fri, Dec 5, 2008 at 6:32 AM, Jeff Talbot <jeff.a.talbot at gmail.com> wrote: >> >> There is a seemingly very useful line of code in the cucumber wiki >> that I''d like to use: >> >> After do >> # Scenario teardown >> Database.truncate_all >> end > > That''s just an example of some code you might call in an After. A little > lower, you see > > TempFileManager.clean_up > > which also looks like non-Rails/Cucumber code. > > A simple way to achieve the former would be > > class Database > def self.truncate > TheModel.destroy_all > TheOtherModel.destroy_all > # etc > end > end > > destroy_all isn''t exactly the same as SQL TRUNCATE, but it might serve your > purpose. > > ///ark > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >
On Sat, Dec 6, 2008 at 2:47 AM, David Salgado <david at digitalronin.com>wrote:> ISTR that "destroy_all" will instantiate each object, before > destroying it. If you just want to clean the database, I think > "delete_all" is the one you want (it just does a "delete from > [table]", if memory serves), and should be a lot quicker. >Yes, you''re right. I always get those mixed up. ///ark -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081206/a6eb38a0/attachment.html>
Jeff Talbot wrote:> There is a seemingly very useful line of code in the cucumber wiki > that I''d like to use: > > After do > # Scenario teardown > Database.truncate_all > end > > (from http://github.com/aslakhellesoy/cucumber/wikis/migration-from-rspec-stories) > > But when I run this I get an uninitialized constant error for "Database". > > Anybody know if/how I can make this call? Is there something I need to > require? Is there a different way of doing this now? I have a need to > not use transactional_fixtures for a specific suite of tests and I > want to clear out the database after every run so my tests are > isolated. > > Thanks, > Jeff >As pointed out this was just an example. For ideas on how to implement such a method you can read this previous thread about it: http://www.mail-archive.com/rspec-users at rubyforge.org/msg06597.html -Ben
Cool. Thanks, guys. On Sat, Dec 6, 2008 at 11:28 AM, Ben Mabey <ben at benmabey.com> wrote:> Jeff Talbot wrote: >> >> There is a seemingly very useful line of code in the cucumber wiki >> that I''d like to use: >> >> After do >> # Scenario teardown >> Database.truncate_all >> end >> >> (from >> http://github.com/aslakhellesoy/cucumber/wikis/migration-from-rspec-stories) >> >> But when I run this I get an uninitialized constant error for "Database". >> >> Anybody know if/how I can make this call? Is there something I need to >> require? Is there a different way of doing this now? I have a need to >> not use transactional_fixtures for a specific suite of tests and I >> want to clear out the database after every run so my tests are >> isolated. >> >> Thanks, >> Jeff >> > > As pointed out this was just an example. For ideas on how to implement such > a method you can read this previous thread about it: > http://www.mail-archive.com/rspec-users at rubyforge.org/msg06597.html > > -Ben > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >
2008-12-05 08:32, Jeff Talbot:> I want to clear out the database after every run so my tests are > isolated.Maybe a minor detail, but I''d suggest you clear out the db _before_ each run. -- Tero Tilus ## 050 3635 235 ## http://tero.tilus.net/
On 7 Dec 2008, at 17:56, Tero Tilus wrote:> 2008-12-05 08:32, Jeff Talbot: >> I want to clear out the database after every run so my tests are >> isolated. > > Maybe a minor detail, but I''d suggest you clear out the db _before_ > each run.I respectfully disagree :) If I need this done, I can run rake db:test:prepare I think the tests should clean up after themselves. As you can see from the thread Ben linked to, it''s pretty easy to watch what ActiveRecord is doing, and truncate all the tables that have been touched during a scenario. Matt Wynne http://blog.mattwynne.net http://www.songkick.com
On Sun, Dec 7, 2008 at 8:07 PM, Matt Wynne <matt at mattwynne.net> wrote:> On 7 Dec 2008, at 17:56, Tero Tilus wrote: > > 2008-12-05 08:32, Jeff Talbot: >> >>> I want to clear out the database after every run so my tests are >>> isolated. >>> >> >> Maybe a minor detail, but I''d suggest you clear out the db _before_ >> each run. >> > > I respectfully disagree :) >I respectfully disagree :-) Two reasons: Firstly, this quickly leads to coupled tests. If test N+1 only passes if test N cleans up, test N+1 will fail if run in isolation. Secondly, if each test cleans up after itself, you can''t manually look at the database to figure out why a test fails - there is no data! Aslak> > If I need this done, I can run rake db:test:prepare > > I think the tests should clean up after themselves. > > As you can see from the thread Ben linked to, it''s pretty easy to watch > what ActiveRecord is doing, and truncate all the tables that have been > touched during a scenario. > > > Matt Wynne > http://blog.mattwynne.net > http://www.songkick.com > > > _______________________________________________ > 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/20081207/795746d6/attachment.html>
On 7 Dec 2008, at 19:20, aslak hellesoy wrote:> > > On Sun, Dec 7, 2008 at 8:07 PM, Matt Wynne <matt at mattwynne.net> wrote: > On 7 Dec 2008, at 17:56, Tero Tilus wrote: > > 2008-12-05 08:32, Jeff Talbot: > I want to clear out the database after every run so my tests are > isolated. > > Maybe a minor detail, but I''d suggest you clear out the db _before_ > each run. > > I respectfully disagree :) > > I respectfully disagree :-) Two reasons: > > Firstly, this quickly leads to coupled tests. If test N+1 only > passes if test N cleans up, test N+1 will fail if run in isolation.I think you misunderstand me. All our cucumber tests automatically clean up the database after each scenario is run. No chance of nasty coupling nonsense, but they do all assume that they''ll start with an empty database.> Secondly, if each test cleans up after itself, you can''t manually > look at the database to figure out why a test fails - there is no > data!Good point - I never thought of that! I just think a cleanup *before* a run would have to be more indiscriminate, and therefor slower. Our strategy of keeping a list of tables touched during a scenario then truncating them in the After do block has worked very well for us. YMMV of course :)> Aslak > > > If I need this done, I can run rake db:test:prepare > > I think the tests should clean up after themselves. > > As you can see from the thread Ben linked to, it''s pretty easy to > watch what ActiveRecord is doing, and truncate all the tables that > have been touched during a scenario. > > > Matt Wynne > http://blog.mattwynne.net > http://www.songkick.com > > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-usersMatt Wynne http://blog.mattwynne.net http://www.songkick.com