2016-05-02 11 views
0

レールの楽観的なロックの動作が機能しているように見えることを前に説明しますが、単体テストがその値を返す理由を理解しようとしています。私の単体テストを実行しているときに、lock_versionが増分するかどうかをチェックし、assert_not_equal私は合格テストを受け取ります。テストをassert_equalに設定すると失敗しますが、メッセージは0ではなくnilを返します。なぜですか?期待オプティミスティックロックはnilで始まり​​ますか?

lock_version詳細 Data_type => Number(38,0), Nullable => No, Data_default => 0

ユニットテスト

test "optimistic locking increments" do 
    invoice = create(:invoice) 
    first = Invoice.find(invoice.invoice_id) 
    second = Invoice.find(invoice.invoice_id) 
    first.currency = "GBP" 
    second.currency = "EUR" 
    first.save 
    second.save 
    assert_equal first.lock_version, second.lock_version 
    end 

:1

:実際 ゼロ更新

テストをassert_not second.saveに変更すると失敗します。私の理解では、オプティミスティック・ロックは第2の値の保存(更新)を妨げるはずです。どうしてそうでないかもしれませんか?私は私のlock_version列を生成するときKristjánの提案first.lock_versionリターンを1として

は「」ではなく、0

+0

DBのデフォルト値が0であることを確認するためにオブジェクトを見つけた直後に 'lock_version'を印刷できますか?さもなければ、オプティミスティックロックは正常に更新されるまでそれを 'nil'のままにします。 –

+0

オブジェクトを見つけた後にfirst.lock_versionを出力すると、何も返されません。私が工場で0と指定しても、それはまだ何も出てこない。 SQL Developerでモデルを調べると、デフォルトが0であるという確認が表示されますが、印刷するという提案は、私に何か他のものがないかどうか質問してくれます。 – CheeseFry

答えて

0

私は、次の移行を使用していました。

class AddLockVersionToInvoice < ActiveRecord::Migration 
    def change 
    add_column :ch_invoice, :lock_version, :integer, default: 0, null: false 
    end 
end 

宝石

ruby-oci8 (2.2.1) activerecord-oracle_enhanced-adapter (1.6.7, 1.6.6)

どういうわけか、この組み合わせは動作しません。 null:falseを削除し、データベース内のオブジェクトを再作成してDIDで修正します。これが既知のバグかどうかはわかりませんが、私の同僚は拡張アダプターの宝石で作業している人と話をし、それ以上の洞察を得ることができるかどうかを確認する機会があります。

上記の変更により、楽観的なロックの動作が機能しています。 N.B. orginally私はこのrailscastから始まったマイグレーション。