I am following the rails book, and arrived to the section about
testing. The test database is configured as:
test:
adapter: sqlite3
database: “:memory:”
and I get this error with the simple product test:
% ruby test/unit/product_test.rb
Loaded suite test/unit/product_test
Started
E/usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.1.0/lib/sqlite3/
errors.rb:94:in check': cannot rollback - no transaction is active (SQLite3::SQLException) from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.1.0/ lib/sqlite3/resultset.rb:76:incheck’
from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.1.0/
lib/sqlite3/resultset.rb:68:in commence' from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.1.0/ lib/sqlite3/resultset.rb:61:ininitialize’
from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.1.0/
lib/sqlite3/statement.rb:158:in execute' from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.1.0/ lib/sqlite3/database.rb:211:inexecute’
from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.1.0/
lib/sqlite3/database.rb:186:in prepare' from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.1.0/ lib/sqlite3/database.rb:210:inexecute’
from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.1.0/
lib/sqlite3/database.rb:620:in rollback' ... 11 levels... from /usr/local/lib/ruby/1.8/test/unit/autorunner.rb:200:inrun’
from /usr/local/lib/ruby/1.8/test/unit/autorunner.rb:13:in
`run’
from /usr/local/lib/ruby/1.8/test/unit.rb:285
from test/unit/product_test.rb:7
yeah, whoops. I just assumed when it stopped giving me errors that it
had worked. I guess I should examine things more carefully next time.
This means that I still do not have it working.
Also keep in mind that SQLite does not support nested transactions.
So if your test starts a transaction (the default behavior) and then
your production code under test starts another transaction, the test
transaction rollback probably won’t work.
Also keep in mind that SQLite does not support nested transactions.
So if your test starts a transaction (the default behavior) and
then your production code under test starts another transaction,
the test transaction rollback probably won’t work.
Ah, this might be relevant.
My test is a pretty simple unit test for the Product model of Depot,
but maybe ActiveRecord is using some transaction behind the scenes.
If that was the case, why surprises me is that SQLite in-memory for
test is what rails(1) generates. If it does not work even in the
simplest of the tests it shouldn’t be there.
I have not been able to get the ‘sqlite3’ adapter to work, just using
‘sqlite’ should work. In addition, the sqlite adapter needs the
‘dbfile:’ argument rather than ‘database:’. Lastly, use “:memory”
instead of “:memory:”, omit the second colon. That made it work for
me.
The problem occurs when Rails attempts to rollback the transaction. It
seems like sqlite may be dropping the database (i.e. removing it from
memory) earlier than it should and thus when it comes time to close
the transaction, the database is already gone.
On Tue, Jan 03, 2006 at 01:02:29PM -0500, Andrew S. wrote:
But it might work if you don’t use transactional fixtures. Try changing the
line in test/test_helper.rb to
self.use_transactional_fixtures = false
As several people have reported in the past, thisdoesnotwork.
The problem isn’t the transactions, it’s the complete lack of tables in
the
in-memory database. Please stop suggesting it as a solution.
Matt
What do you mean by ‘the complete lack of tables in the in-memory
database’? SQLite in-memory databases do support tables…
On Tue, Jan 03, 2006 at 01:02:29PM -0500, Andrew S. wrote:
But it might work if you don’t use transactional fixtures. Try changing the
line in test/test_helper.rb to
self.use_transactional_fixtures = false
As several people have reported in the past, thisdoesnotwork.
The problem isn’t the transactions, it’s the complete lack of tables in
the
in-memory database. Please stop suggesting it as a solution.
So as I understand it, because the test database is generated in a
separate
rake task, and it disappears once that task completes, the in-memory
database you get when you tests start to run is in fact a new, empty
database.
It would appear that the in-memory sqlite database example in
database.ymlis just a cruel hoax…