Database.truncate_all


#1

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


#2

On Fri, Dec 5, 2008 at 6:32 AM, Jeff T. removed_email_address@domain.invalid
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


#3

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 W. removed_email_address@domain.invalid:


#4

Jeff T. wrote:

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/removed_email_address@domain.invalid/msg06597.html

-Ben


#5

On Sat, Dec 6, 2008 at 2:47 AM, David S.
removed_email_address@domain.invalidwrote:

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


#6

Cool. Thanks, guys.


#7

2008-12-05 08:32, Jeff T.:

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.


#8

On 7 Dec 2008, at 17:56, Tero T. wrote:

2008-12-05 08:32, Jeff T.:

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 :slight_smile:

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 W.
http://blog.mattwynne.net
http://www.songkick.com


#9

On 7 Dec 2008, at 19:20, aslak hellesoy wrote:

each run.

I respectfully disagree :slight_smile:

I respectfully disagree :slight_smile: 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 :slight_smile:


rspec-users mailing list
removed_email_address@domain.invalid
http://rubyforge.org/mailman/listinfo/rspec-users

Matt W.
http://blog.mattwynne.net
http://www.songkick.com


#10

On Sun, Dec 7, 2008 at 8:07 PM, Matt W. removed_email_address@domain.invalid wrote:

I respectfully disagree :slight_smile:

I respectfully disagree :slight_smile: 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