3

测试/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

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

4

1 回答 1

5

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

您没有说明您使用哪个数据库,但ROLLBACK没有重置AUTO_INCREMENTvalues,无论是在 MySQL 中(参见bug #6714)还是在 PostgreSQL 中(参见bug #1139)。

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

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

于 2016-03-25T16:39:40.340 回答