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 しかし、これは DB にアクセスする外部プロセスなど、他の必要性を壊します
- フラッシュする方法を探しています(ただし、「トランザクション」にのみ適用されるようです)
- 「save_points」をコミットする方法を探してみました(運が悪い)
- provider.create!
- () ベース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