【问题标题】:Test db not rolling back after each run每次运行后测试数据库不回滚
【发布时间】:2010-09-18 08:35:10
【问题描述】:

更新:已修复!!!!!! 正如我怀疑的那样,这是一个以某种方式搞砸的配置 - 随之而来的是大量的头发拉扯。出于某种原因,“require 'test_help'”已从 test_helper.rb 中删除,将其重新添加,所有测试现在都在事务中。

这听起来像是一个基本的配置问题,但我不知道是什么。 Rails 2.3.5,Ruby 1.8.7 补丁 173。我正在使用 Shoulda+factory girl 并进行了测试,为设置创建了几个用户

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)

【问题讨论】:

  • 您是否在工厂中指定用户 ID?
  • 是的,我是——尽管我只是对其进行了调整,无论是否指定主键都没有区别。虽然我理解它的方式,但如果事务回滚,这应该没关系?
  • 很奇怪。没有其他地方将 use_transactional_fixtures 设置为 false,在您的测试之前包含或执行?不要忘记测试是按字母顺序完成的,而不是它们的书写顺序。
  • Stephen,我发现无论出于何种原因,我在 test_helper 中都没有“require 'test_help'”。感谢您的回复并让我的大脑正常工作,我将您的答案标记为正确的答案,以便您获得赏金:)

标签: ruby-on-rails


【解决方案1】:

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

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

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

【讨论】:

  • 感谢斯蒂芬。是的,我已经配置了 transactional_fixtures(并用该信息更新了我的 Q)
  • 很奇怪。两个想法:测试没有按照您指定的顺序执行,那么它可以在另一个首先执行的测试中设置为 false 吗?另一件事是你能证明mysql服务器实际上会回滚一个事务吗?
  • Stephen,我发现无论出于何种原因,我在 test_helper 中都没有“require 'test_help'”。感谢您的回复并让我的大脑正常工作,我将您的答案标记为正确的答案,以便您获得赏金:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    对于那些希望将测试包装在事务中但不使用 Rails 的人, 而是单独使用 ActiveSupport 和 ActiveRecord,您应该手动包含 ActiveRecord::TestFixtures:

    ActiveSupport::TestCase.include ActiveRecord::TestFixtures
    

    否则将不会定义包括 use_transactional_fixtures/use_transactional_tests 在内的事务功能。

    【讨论】:

      猜你喜欢
      • 2023-01-11
      • 2013-11-08
      • 2012-11-26
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      相关资源
      最近更新 更多