レールの楽観的なロックの動作が機能しているように見えることを前に説明しますが、単体テストがその値を返す理由を理解しようとしています。私の単体テストを実行しているときに、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
DBのデフォルト値が0であることを確認するためにオブジェクトを見つけた直後に 'lock_version'を印刷できますか?さもなければ、オプティミスティックロックは正常に更新されるまでそれを 'nil'のままにします。 –
オブジェクトを見つけた後にfirst.lock_versionを出力すると、何も返されません。私が工場で0と指定しても、それはまだ何も出てこない。 SQL Developerでモデルを調べると、デフォルトが0であるという確認が表示されますが、印刷するという提案は、私に何か他のものがないかどうか質問してくれます。 – CheeseFry