ОБНОВЛЕНИЕ: ИСПРАВЛЕНО !!!!!
Как я и подозревал, это был конфиг, который каким-то образом запутался - за этим последовало сильное растяжение волос. По какой-то причине "require 'test_help'" был удален из test_helper.rb, добавил его обратно, и все тесты сейчас находятся в транзакции.
Это пахнет как основная проблема конфигурации, но я не могу понять, что. Rails 2.3.5, Ruby 1.8.7, патч 173. Я использую фабричную девочку Shoulda +, и у меня есть тест, который создает пару пользователей для настройки
class UserTest < ActiveSupport::TestCase
use_transactional_fixtures = true
context "getting a user's email" do
setup do
... stubs ...
end
should "populate email field if not present" do
@user = Factory.create(:molly_perkins)
@user.get_email(@facebook_session)
assert_equal 'molly.perkins.test@gmail.com', @user.email
end
should "not populate email if already present" do
@user = Factory.create(:amanda_levy)
@user.get_email(@facebook_session)
assert_equal 'amandalevy06@gmail.com', @user.email
end
end
end
Тесты пройдены, но проблема в том, что после запуска они, похоже, не очищаются - глядя на test.log, я вижу, что транзакции фиксируют вставки! Что дает?
# First test
User Create (0.3ms) INSERT INTO `users` ...
SQL (0.4ms) COMMIT
# Second test
SQL (0.1ms) BEGIN
User Create (0.3ms) INSERT INTO `users` ....
SQL (0.4ms) COMMIT
SQL (0.1ms) BEGIN
User Update (0.4ms) UPDATE `users` ....
SQL (0.4ms) COMMIT
Чтобы обойти это, я просто использую блок разрыва «Model.all.each (&: destroy)», но мне не нужно было этого делать, и это медленно / неопрятно, чтобы уничтожать все, что я экземпляр. Транзакции должны просто откатиться ...
Таблица в тестовой БД - InnoDB:
mysql> select engine from tables where table_name = 'users' and table_schema = 'voltron_test';
+--------+
| engine |
+--------+
| InnoDB |
+--------+
и я использую транзакционные средства (из test_helper.rb):
class ActiveSupport::TestCase
use_transactional_fixtures = true
end
Транзакции работают (доступ к тестовой БД из консоли):
mysql> select * from users;
Empty set (0.00 sec)
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `users` ...
Query OK, 1 row affected (0.00 sec)
mysql> select * from users;
...
1 row in set (0.00 sec)
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from users;
Empty set (0.00 sec)