Unit tests breaks with sqlite

Hi,

I'm using an sqlite3 database with Rails and have some trouble running unit tests

What I've done is * rails my_app * edited database.yml to use sqlite3 adapter, db/my_app_development and db/my_app_test * ruby script\generate model user * edited model

    class User < ActiveRecord::Base         validates_presence_of :name         validates_uniqueness_of :name     end

* edited db/migrate/001_create_users.rb migration:

    def self.up         create_table :users do |t|           t.column :name, :string, :null => false         end         User.create(:name => 'administrator')     end

* and:

    def self.down         drop_table :users     end

* rake db:migrate * rake db:test:prepare

At this point, the 2 DBs are created correctly.

* rake test:units

The problem is that, but when I want to run a (any) test, I get a "SQL logic error or missing database (SQLite3::SQLException). I can however access the DB via the sqlite3 client/rails console without any problem.

Here's the exact error message I get:

  Loaded suite C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/ lib/rake/rake_test_loader   Started   EC:/InstantRails/ruby/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.1- mswin32/lib/sqlite3/errors.rb:94:in `check': SQL logic error or missing database (SQLite3::SQLException)         from C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/sqlite3- ruby-1.2.1-mswin32/lib/sqlite3/resultset.rb:76:in `check'         from C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/sqlite3- ruby-1.2.1-mswin32/lib/sqlite3/resultset.rb:68:in `commence'         from C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/sqlite3- ruby-1.2.1-mswin32/lib/sqlite3/resultset.rb:61:in `initialize'         from C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/sqlite3- ruby-1.2.1-mswin32/lib/sqlite3/statement.rb:163:in `new'         from C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/sqlite3- ruby-1.2.1-mswin32/lib/sqlite3/statement.rb:163:in `execute'         from C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/sqlite3- ruby-1.2.1-mswin32/lib/sqlite3/database.rb:212:in `execute'         from C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/sqlite3- ruby-1.2.1-mswin32/lib/sqlite3/database.rb:187:in `prepare'         from C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/sqlite3- ruby-1.2.1-mswin32/lib/sqlite3/database.rb:211:in `execute'          ... 16 levels...         from C:/InstantRails/ruby/lib/ruby/1.8/test/unit/autorunner.rb: 200:in `run'         from C:/InstantRails/ruby/lib/ruby/1.8/test/unit/autorunner.rb: 13:in `run'         from C:/InstantRails/ruby/lib/ruby/1.8/test/unit.rb:278         from C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/ lib/rake/rake_test_loader.rb:5

I'm using Rails 1.2.3 with ruby 1.8.5, sqlite3.3.7 and sqlite3-ruby (1.2.1) Any help would be greatly appreciated!

Thanks in advance,

Frédéric Delanoy

I've seen that "logic error" where there was a COMMIT or ROLLBACK, but no transaction was in flight. This is an Exception (not an Error), and Test::Unit doesn't catch them, unfortunately.

Somewhere within this line:         ... 16 levels... is your unit test code.

To debug it, modify something like execute in sqlite3/database.rb to do the following:

rescue Exception => e   puts e.message   puts e.backtrace   raise end

so that you can see those "16 levels".

Alex

I've finally found the source of the problem: it was due to the default fixtures in use, i.e.

first   id: 1 second   id: 2

After adding a (mandatory in my model) name attribute in the fixture, like first   id: 1   name: foo second   id:2   name: bar

it worked.

However, what's odd is that evenif I commented the line   fixtures :users in the unit test file, I had the some error.

Maybe the fixtures are used automagically ???

In all cases, thank you for your help Alexey !

Frédéric