0

我知道我误解了 ActiveRecord 如何保持完整性/工作:希望有人可以为我解释为什么以下内容不起作用?

我们有一个异常情况:我们的 rails 应用程序调用了一个已编译的二进制文件,该二进制文件访问共享数据库中的(并创建一个新的表行,它不会更新现有的行)。因此,我们在 rails_helper 中运行 config.use_transactional_fixtures = false (否则我们会收到保存点错误)。数据需要在场景中提交,以便此旧版应用程序可以在测试期间访问数据库中的数据。

在测试期间,我们通过 eval(rubyexpression) 设置数据(完整代码见下文)

  "provider = Provider.create({:provider_reseller_phone_number => '0200000000', :provider_registered_business_name => 'ProviderReseller', :provider_name => 'providerwithzero'})"

笔记:

  • 我知道我们应该为此使用 factorygirl,那是另一回事
  • 没有额外的提供者模型代码,例如回调、钩子什么的

使用调试器暂停测试(第 22 行),数据不会保存到数据库中,但一旦 rspec 完成,它就在那里。

我们无法弄清楚为什么!?每次交易后肯定会提交数据,例如eval?

感谢任何指导/学习?

我们试过了

spec_test_eval.rb

require 'rails_helper'

describe 'trying to test using rails populated data for external process' do

  it 'populates provider and tests external process' do
      initial_data = "provider = Provider.create({:provider_reseller_phone_number => '0200000000', :provider_registered_business_name => 'ProviderReseller', :provider_name => 'providerwithzero'})"
    eval(initial_data)
    debugger
    expect Provider.all.count.eql?(1)
    # using mysql to check providers table its empty
    exec_path_str = "#{EXTERNALPROCESS} 1 1"
    stdop_content = `#{exec_path_str}`
  end
end

test.log 输出

     ActiveRecord::SchemaMigration Load (0.2ms)  SELECT `schema_migrations`.* FROM `schema_migrations`
       (0.1ms)  BEGIN
       (0.1ms)  SAVEPOINT active_record_1
      SQL (0.2ms)  INSERT INTO `providers` (`created_at`, `provider_name`, `provider_registered_business_name`, `provider_reseller_phone_number`, `updated_at`) VALUES ('2014-12-27 03:33:21', 'providerwithzero', 'ProviderReseller', '0200000000', '2014-12-27 03:33:21')
       (0.1ms)  RELEASE SAVEPOINT active_record_1
       (0.2ms)  SELECT COUNT(*) FROM `providers`
       (0.4ms)  ROLLBACK
4

1 回答 1

1

所以似乎是导致这种行为的 DatabaseCleaner gem。

了解了截断、事务等差异(我们启用了事务的数据库清理策略,它强制执行周围事务和回滚。但是使用 DatabaseCleaner.strategy = :truncation)允许每个 ActiveRecord 操作提交到数据库。以速度为代价。

鉴于这确实会减慢测试速度,我们只需要进行一些特殊测试,现在根据标志/属性搜索不同策略的解决方案。

于 2015-01-04T22:50:40.007 回答