DatabaseCleaner不会在rails测试单元中重置自动增量索引

时间:2016-03-25 15:36:51

标签: ruby-on-rails unit-testing database-cleaner

test / test_helper.rb:

ENV["RAILS_ENV"] ||= "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'database_cleaner'

DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation, pre_count: true, reset_ids: true)

class ActiveSupport::TestCase
  ActiveRecord::Migration.check_pending!


  def setup
    DatabaseCleaner.start
  end


  def teardown
    DatabaseCleaner.clean
    p '-------- DB Cleaned ---------'
  end

end

我的测试单元文件:( test1和2是重复的)

require 'test_helper'

class ItemTest < ActiveSupport::TestCase

  test "test1" do
    i = Item.create!

    p ActiveRecord::Base.connection.execute("SELECT auto_increment FROM information_schema.tables WHERE table_schema = 'tmi_game_test' AND table_name = 'items';").first

    assert_equal 1, Item.count
    assert_equal 1, i.id
  end

  test "test2" do
    i = Item.create!

    p ActiveRecord::Base.connection.execute("SELECT auto_increment FROM information_schema.tables WHERE table_schema = 'tmi_game_test' AND table_name = 'items';").first

    assert_equal 1, Item.count
    assert_equal 1, i.id
  end

end

结果:

# Running:

[2]
"-------- DB Cleaned ---------"
.[3]
"-------- DB Cleaned ---------"
F

Finished in 0.142886s, 13.9972 runs/s, 27.9944 assertions/s.

  1) Failure:
ItemTest#test_test2 [test/models/item_test.rb:45]:
Expected: 1
  Actual: 2

2 runs, 4 assertions, 1 failures, 0 errors, 0 skips

为什么dos不起作用?我的错在哪里?

1 个答案:

答案 0 :(得分:4)

这是预期的行为。您正在使用:transaction策略来清理表。这意味着每个测试都包含在一个事务中,该事务在测试后ROLLBACK - teardown期间)。

您尚未说明您使用的是哪个数据库,但 ROLLBACK未重置AUTO_INCREMENT,MySQL(请参阅bug #6714)和PostgreSQL(见bug #1139)。

根据这个SO answer我认为你应该永远不要依赖于测试中的auto_increment ID值。我认为您应该测试其他属性,而不是断言您正在处理预期的记录。

如果您确实需要重置AUTO_INCREMENT计数器,请改用:truncation清洁策略。即删除clean_with行,然后将策略设置为:truncation。它比交易要慢得多。