[rspec-users] Specifying certain tables NOT to be cleared each example?
Andrew Selder
aselder at mac.com
Thu May 22 11:13:41 EDT 2008
I tried modifying rspec.rake to read
spec_prereq = File.exist?(File.join(RAILS_ROOT, 'config',
'database.yml')) ? [:testing, "db:test:purge", "db:migrate"] : :noop
task :noop do
end
task :testing do
RAILS_ENV = ENV['RAILS_ENV'] = 'test'
end
which should do what I want, I think. However the db:migrate task
blows up with a message:
rake aborted!
Mysql::Error: No database selected: SHOW TABLES
/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.991/lib/
active_record/connection_adapters/abstract_adapter.rb:151:in `log'
/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.991/lib/
active_record/connection_adapters/mysql_adapter.rb:299:in `execute'
/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.991/lib/
active_record/connection_adapters/mysql_adapter.rb:403:in `tables'
/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.991/lib/
active_record/connection_adapters/abstract/schema_statements.rb:313:in
`initialize_schema_migrations_table'
/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.991/lib/
active_record/migration.rb:388:in `initialize'
/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.991/lib/
active_record/migration.rb:357:in `new'
/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.991/lib/
active_record/migration.rb:357:in `up'
/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.991/lib/
active_record/migration.rb:340:in `migrate'
/opt/local/lib/ruby/gems/1.8/gems/rails-2.0.991/lib/tasks/
databases.rake:99
I examined the connection item and it is pointing to the right DB.
It's strange since the db:migrate task work in isolation.
Anyway, for now I'll manually setup my db for test.
Thanks all,
Andrew
On May 22, 2008, at 10:25 AM, David Chelimsky wrote:
> On Thu, May 22, 2008 at 9:12 AM, Andrew Selder <aselder at mac.com>
> wrote:
>> Downloaded the latest plugins from Github and got the same results.
>>
>> The spec rake task still ends up calling db:test:prepare which
>> blows away
>> the database and reloads only the schema.
>
> Well, thanks for trying.
>
> You can't be the first person to run up against this problem. I've run
> into it before but not in any rails apps I've worked on.
>
> Sounds like the solution would be something like what Scott and Ashley
> are talking about - introducing rake db:migrate or a custom data setup
> task after or instead of db:test:prepare.
>
>>
>> Thanks,
>>
>> Andrew
>>
>> On May 22, 2008, at 9:58 AM, David Chelimsky wrote:
>>
>>> On Thu, May 22, 2008 at 8:55 AM, Andrew Selder <aselder at mac.com>
>>> wrote:
>>>>
>>>> David,
>>>>
>>>> The static data generated in the migrations in being wiped away.
>>>>
>>>> I did a
>>>> rake db:test:purge
>>>>
>>>> followed by
>>>>
>>>> rake db:migrate RAILS_ENV=test
>>>>
>>>> and then looked in my database to verify that the data was there
>>>> and it
>>>> was.
>>>>
>>>> And then when I run rake spec, the test blow up and I looks at
>>>> the DB and
>>>> all the static tables are empty.
>>>>
>>>> Looking at the rspec.rake file in the rspec_on_rails plugin, the
>>>> spec
>>>> task
>>>> calls the spec_prereq task. This task does a db:test:prepare, which
>>>> looking
>>>> at the source for that in the rails gem only copies the schema
>>>> from the
>>>> development db.
>>>>
>>>> I'm using Rails 2.1 RC1, and the tagged CURRENT version of both
>>>> plugins.
>>>
>>> AHA!
>>>
>>> CURRENT means the latest release, which is 1.1.3, which was released
>>> months ago, before Rails 2.1 RC1.
>>>
>>> Try the latest from github:
>>>
>>> script/plugin install git://github.com/dchelimsky/rspec.git
>>> script/plugin install git://github.com/dchelimsky/rspec-rails.git
>>> script/generate rspec
>>>
>>> See if that makes any difference.
>>>
>>> Cheers,
>>> David
>>>
>>>>
>>>> Thanks,
>>>>
>>>> Andrew
>>>>
>>>> On May 22, 2008, at 9:32 AM, David Chelimsky wrote:
>>>>
>>>>> On May 21, 2008, at 9:49 PM, Andrew Selder wrote:
>>>>>
>>>>>> Is it possible to specify that certain tables not be cleared on
>>>>>> each
>>>>>> example.
>>>>>>
>>>>>> I've inherited a project where a good amount of enumerated data
>>>>>> is
>>>>>> stored
>>>>>> in the database (US States, statuses, about 15-20 tables worth.
>>>>>> Over
>>>>>> all,
>>>>>> it's a reasonable decision that leads to solid production code
>>>>>> (acts_as_enumerated is good). This data is read-only and
>>>>>> relatively
>>>>>> static;
>>>>>> any changes to these tables are done via migrations.
>>>>>>
>>>>>> The problem comes when I'm writing my tests. Obviously all
>>>>>> these tables
>>>>>> get wiped with each example.
>>>>>
>>>>> This should not be the case. Transactions get rolled back, but
>>>>> tables do
>>>>> not just get wiped clean.
>>>>>
>>>>> If this static data is being generated in migrations, then you
>>>>> should be
>>>>> OK. Is it?
>>>>>
>>>>>> Yes, I could specify these as fixtures, but I really don't want
>>>>>> to have
>>>>>> to specify 15-20 fixtures on every example. Yes, I could mock/
>>>>>> stub all
>>>>>> the
>>>>>> values, except that I use many of these values at class
>>>>>> definition
>>>>>> time,
>>>>>> which means that errors are thrown before I can even mock/stub.
>>>>>>
>>>>>> For instance, I have a statement like this.
>>>>>>
>>>>>> named_scope :open, :conditions => ["lead_status_id IN (?)",
>>>>>> %w{New
>>>>>> Incubating Client UAG}.collect{|x| LeadStatus[x].id}]
>>>>>>
>>>>>> Which loads the named_scope using the string version of the
>>>>>> enumeration
>>>>>> for clarity's sake. It works great, except for testing.
>>>>>>
>>>>>> Does anybody see anyway around this other than creating a
>>>>>> fixture file
>>>>>> for each of these tables and loading all the fixtures on each
>>>>>> describe
>>>>>> block. Not only does this make for ugly code, but I'm sure it
>>>>>> takes a
>>>>>> good
>>>>>> chunk of time to setup and teardown each of the tables each
>>>>>> example.
>>>>>>
>>>>>> It would be wonderful if there was some option to specify
>>>>>> tables that
>>>>>> behave like this, that should be loaded at the beginning of the
>>>>>> test
>>>>>> run,
>>>>>> and (optionally) trashed at the end of the run. Or even better,
>>>>>> specify
>>>>>> that
>>>>>> the test script shouldn't touch (build or teardown) these
>>>>>> tables at
>>>>>> all, and
>>>>>> let their migrated state remain.
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> Andrew
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
More information about the rspec-users
mailing list