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?

ガイダンス/学習に感謝しますか?

私たちは試しました

  • プロバイダー変数で 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
4

1 に答える 1

1

したがって、この動作を引き起こしているのは DatabaseCleaner gem のようです。

切り捨て、トランザクションなどの違いを理解すると (トランザクションを有効にして、周囲のトランザクションとロールバックを強制するデータベース クリーナー戦略。ただし、DatabaseCleaner.strategy = :truncation を使用すると)、各 ActiveRecord アクションをデータベースにコミットできます。スピードを犠牲にして。

これによりテストが遅くなり、いくつかの特別なテストのみが必要になるため、フラグ/属性に基づいてさまざまな戦略のソリューションを検索しています。

于 2015-01-04T22:50:40.007 に答える