Ruby on rails 在Rspec中禁用事务性装置没有效果

Ruby on rails 在Rspec中禁用事务性装置没有效果,ruby-on-rails,rspec,fixtures,rspec2,Ruby On Rails,Rspec,Fixtures,Rspec2,由于我使用的是一个遗留数据库,我一直使用MyISAM的MySQL,这意味着我的表不支持事务。这会导致测试失败,因为测试生成的表数据(我使用factory_girl作为fixture)不会针对每个场景还原 我发现Rspec公开了spec\u helper.rb中的config.use\u transactional\u fixtureconfig设置 默认情况下设置为true。当我将其设置为false时,我看不到对我的测试有任何影响;由于重复记录,它们仍然失败 该设置不应该自动展开对数据库所做的任

由于我使用的是一个遗留数据库,我一直使用MyISAM的MySQL,这意味着我的表不支持事务。这会导致测试失败,因为测试生成的表数据(我使用factory_girl作为fixture)不会针对每个场景还原

我发现Rspec公开了spec\u helper.rb中的
config.use\u transactional\u fixture
config设置

默认情况下设置为true。当我将其设置为false时,我看不到对我的测试有任何影响;由于重复记录,它们仍然失败


该设置不应该自动展开对数据库所做的任何更改吗?还是我应该手动执行此操作?

您是正确的-如果您的数据库不支持事务,则必须在每个语句之前发出几个SQL命令来清除数据:

TRUNCATE TABLE tablename;
每张桌子一张

在您的helper.rb中,尝试以下操作:

Spec::Runner.configure do |config|
  config.before(:each) do
    tables = %{users posts tags}
    tables.each do |t|
      ActiveRecord::Base.connection.execute('TRUNCATE TABLE #{t}')
    end
  end
  ... 
end 

您是正确的-如果您的数据库不支持事务,则必须在每条语句之前发出多个SQL命令来清除数据:

TRUNCATE TABLE tablename;
每张桌子一张

在您的helper.rb中,尝试以下操作:

Spec::Runner.configure do |config|
  config.before(:each) do
    tables = %{users posts tags}
    tables.each do |t|
      ActiveRecord::Base.connection.execute('TRUNCATE TABLE #{t}')
    end
  end
  ... 
end 

酷,谢谢;我的印象是Rails以某种方式实现了自动化;我的印象是Rails以某种方式自动化了这一点。