测试db在每次运行后不回滚

时间:2010-09-18 08:35:10

标签: ruby-on-rails

更新:固定!!!!! 因为我怀疑这是一个以某种方式搞砸了的配置 - 接下来发了很多头发。出于某种原因,“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(&amp;: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 个答案:

答案 0 :(得分:3)

我从未在测试用例中使用过use_transaction_fixtures = true,但有alwsays:

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

在Rails附带的test / test_helper.rb文件中,从未遇到过这个问题。

答案 1 :(得分:0)

如果您使用的是MyISAM数据库引擎,这很正常,因为它不支持事务。

答案 2 :(得分:0)

小点,但您应该self.use_transactional_fixtures = true

“自我”是必要的。