我知道我误解了 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?
感谢任何指导/学习?
我们试过了
- 在提供者变量上使用 new +“save”,但它不是由 eval 填充的。
- config.use_transactional_fixtures = true 但这打破了我们的其他需求,例如访问数据库的外部进程
- 寻找刷新的方法(但似乎只适用于“交易”)
- 尝试寻找提交“save_points”的方法(不走运)
- 提供者。创建!
- 基于 () Rails 3:ActiveRecord 观察者:在测试期间不会触发 after_commit 回调,但 after_save 会触发run_callbacks(:commit)
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