Тест дБ не откатывается после каждого запуска - PullRequest
5 голосов
/ 18 сентября 2010

ОБНОВЛЕНИЕ: ИСПРАВЛЕНО !!!!! Как я и подозревал, это был конфиг, который каким-то образом запутался - за этим последовало сильное растяжение волос. По какой-то причине "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)

Ответы [ 3 ]

3 голосов
/ 19 сентября 2010

Я никогда не использовал use_transaction_fixtures = true в тестовом примере, но всегда имел:

class Test::Unit::TestCase
    ....
    self.use_transactional_fixtures = true
    ....
end

в файле test / test_helper.rb, который поставляется с Rails и никогда не имел этой проблемы.

0 голосов
/ 17 марта 2011

Маленькая точка, но у вас должно быть self.use_transactional_fixtures = true

"Я" необходимо.

0 голосов
/ 18 сентября 2010

Если вы используете движок MyISAM db, это вполне нормально, так как не поддерживает транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...