Tables deleted when running rake test:units

Hi there! I’m creating an application in RoR and I’m implementing unit
testing in all my models.

When I run every test on his own (by running ruby
test/unit/some_test.rb) all tests are successful.

But when I run all tests together (by running rake test:units) some
tables from both databases (development e test) are deleted.

I’m using raw SQL (mysql) do create tables because I need composite
primary keys and physical constraints so I figured it would be the best.
Maybe this be the cause?

All my tests are in this form:

require File.dirname(FILE) + ‘/…/test_helper’
require File.dirname(FILE) + ‘/…/…/app/models/order’

class OrderTestCase < Test::Unit::TestCase

def setup

@order = Order.new(
:user_id => 1,
:total => 10.23,
:date => Date.today,
:status => ‘processing’,
:date_concluded => Date.today,
:user_address_user_id => 3,
:user_address_address_id => 5,
:creation_date => Date.today,
:update_date => Date.today
)
end

################ Happy Path

def test_happy_path

assert @order.valid?, @order.errors.full_messages

end (…)

The errors I get when running the tests are something like this:

  1. Error: test_empty_is_primary(AddressTestCase):
    ActiveRecord::StatementInvalid: Mysql::Error: Table
    ‘shopshop_enterprise_test.addresses’ doesn’t exist: SHOW FIELDS FROM
    addresses
    /test/unit/address_test.rb:9:in new’
    /test/unit/address_test.rb:9:insetup’

Any guesses? Thanks!

PS: When using postgres as the database engine, everything works fine
with rake test:units! (of course, with the correct changes so the sql
statements can work with postgres)

Simão Freitas wrote:

Hi there! I’m creating an application in RoR and I’m implementing unit
testing in all my models.

When I run every test on his own (by running ruby
test/unit/some_test.rb) all tests are successful.

Slightly off-topic tip: use RSpec instead of Test::Unit. It’s a lot
nicer.

But when I run all tests together (by running rake test:units) some
tables from both databases (development e test) are deleted.

That’s odd. What is your database.yml file like?

I’m using raw SQL (mysql) do create tables

With migrations or not?

because I need composite
primary keys and physical constraints so I figured it would be the best.

BAD IDEA! Use the composite_primary_keys and foreigner plugins.

Maybe this be the cause?

Perhaps. Are all your tables mentioned in schema.rb?

All my tests are in this form:

require File.dirname(FILE) + ‘/…/test_helper’
require File.dirname(FILE) + ‘/…/…/app/models/order’

class OrderTestCase < Test::Unit::TestCase

def setup

@order = Order.new(
:user_id => 1,
:total => 10.23,
:date => Date.today,
:status => ‘processing’,
:date_concluded => Date.today,
:user_address_user_id => 3,
:user_address_address_id => 5,
:creation_date => Date.today,
:update_date => Date.today
)
end

You probably should start using factories (I’m fond of Machinist for
this).

################ Happy Path

def test_happy_path

assert @order.valid?, @order.errors.full_messages

end (…)

The errors I get when running the tests are something like this:

  1. Error: test_empty_is_primary(AddressTestCase):
    ActiveRecord::StatementInvalid: Mysql::Error: Table
    ‘shopshop_enterprise_test.addresses’ doesn’t exist: SHOW FIELDS FROM
    addresses
    /test/unit/address_test.rb:9:in new’
    /test/unit/address_test.rb:9:insetup’

Any guesses? Thanks!

PS: When using postgres as the database engine, everything works fine
with rake test:units! (of course, with the correct changes so the sql
statements can work with postgres)

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]

I didn’t know about Rspec and Machinist. I’ll try them thanks for the
recommendation.

I’m using composite_primary_keys, I didn’t explain myself well lol.

I don’t use migrations.

OH! You’re right! There are tables missing from the schema.rb file.
Don’t know the reason because when I ran the tests (and db creation
previously) separately there was no error. Anyway, there’s an error in
every table that was missing, related to the BIT datatype. Something
like this:

Could not dump table “addresses” because of following StandardError

Unknown type ‘bit(1)’ for column ‘is_primary’

So, maybe that datatype isn’t supported? I think I’ll just use TINYINTs
lol

By the way, I don’t have a very large knowledge about rails, i’m still
figuring it out, but here’s another question:

Can I use migrations with physical constraints in the database? Won’t
they become “nulled” and inconsistent after a migration or any change in
the database? All that will be lost right?

Thanks a lot for your help!

I fixed the problem of the “disappearing tables” with the following code
in environment.rb:

config.active_record.schema_format = :sql

The problem was with some datatypes not recognized by rails (BIT(1) and
(YEAR(4)) I guess. All works fine now.

But I’ll do what you recommend and start using migrations!

Again, I can’t thank you enough! Thanks a lot!

Please quote when replying. It is very difficult to follow the
conversation if you don’t.

Simão Freitas wrote:

I didn’t know about Rspec and Machinist. I’ll try them thanks for the
recommendation.

You’re welcome.

I’m using composite_primary_keys, I didn’t explain myself well lol.

I don’t use migrations.

Well, start now! There are many advantages and virtually no
disadvantages to using migrations.

OH! You’re right! There are tables missing from the schema.rb file.

That would be a serious problem. The test framework uses rake
db:schema:load to create the database.

Don’t know the reason because when I ran the tests (and db creation
previously) separately there was no error. Anyway, there’s an error in
every table that was missing, related to the BIT datatype. Something
like this:

Could not dump table “addresses” because of following StandardError

Unknown type ‘bit(1)’ for column ‘is_primary’

So, maybe that datatype isn’t supported? I think I’ll just use TINYINTs
lol

Use migrations and you won’t have to worry, since Rails handles the
abstraction.

By the way, I don’t have a very large knowledge about rails, i’m still
figuring it out, but here’s another question:

Can I use migrations with physical constraints in the database?

You mean such as foreign key constraints?

Won’t
they become “nulled” and inconsistent after a migration or any change in
the database?

What gives you that idea?

All that will be lost right?

No! Use the foreigner plugin like I suggested.

Thanks a lot for your help!

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]

For the second time: please quote when replying!

Simão Freitas wrote:

I fixed the problem of the “disappearing tables” with the following code
in environment.rb:

config.active_record.schema_format = :sql

The problem was with some datatypes not recognized by rails (BIT(1) and
(YEAR(4)) I guess. All works fine now.

In most cases, if you have to use schema_format = :sql, something is
wrong.

But I’ll do what you recommend and start using migrations!

Again, I can’t thank you enough! Thanks a lot!

You’re welcome!

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]

Marnen Laibow-Koser wrote:

For the second time: please quote when replying!

Sorry :X

Simão Freitas wrote:

I fixed the problem of the “disappearing tables” with the following code
in environment.rb:

config.active_record.schema_format = :sql

The problem was with some datatypes not recognized by rails (BIT(1) and
(YEAR(4)) I guess. All works fine now.

In most cases, if you have to use schema_format = :sql, something is
wrong.

Hum… I’ll see what I can figure out! Thanks again

But I’ll do what you recommend and start using migrations!

Again, I can’t thank you enough! Thanks a lot!

You’re welcome!

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]