Rails テスト データベースはレコードの変更を保持しません
-
23-09-2019 - |
質問
私はここ数週間、問題を解決しようとしてきました。Rails アプリの rspec テストを実行していますが、理解できないエラーが 1 つあることを除いて、正常に動作しています。
- MySQL と InnoDB エンジンを使用しています。
- 設定しました
config.use_transactional_fixtures = true
spec_helper.rb内 - コマンドを使用してテストフィクスチャを手動でロードします
rake spec:db:fixtures:load
. - rspec テストは BackgrounDRb ワーカー用に作成されており、(state_machine gem を通じて) レコードの状態を更新できることをテストしています。
これが私の問題です:
というモデルがあります Listings
. 。rspec テストは、 update_sold_items
というファイル内のメソッド listing_worker.rb
。このメソッドが呼び出すのは、 listing.sell
特定のレコードに対して、出品レコードの「状態」列を「販売済み」に設定します。これまでのところ、これはすべて正常に機能していますが、 update_sold_items
メソッドが終了すると、rspec テストがここで失敗します。
listing = Listing.find_by_listing_id(listing_id)
listing.state.should == "sold"
expected: "sold",
got: "current" (using ==)
状態の変更が持続しない理由を追跡しようとしていますが、ほとんど道に迷っています。これは、次の場所に配置したデバッグ コードの結果です。 update_sold_items
テスト中のメソッド:
pp listing.state # => "current"
listing.sell!
listing.save!
pp listing.state # => "sold"
listing.reload
pp listing.state # => "current"
まったく問題なく保存されているのに、呼び出すたびに元のレコードに戻ってしまう理由が理解できません。 reload
, 、 または Listing.find
等
これをお読みいただきありがとうございます。十分な情報が提供されていない場合は、ご質問ください。
あなたの助けをありがとう、ネイサンb
追伸他のクラスの新しいレコードを作成し、それらのレコードをテストすることに問題はありません。データベースにすでに存在するレコードを更新する場合にのみ問題が発生するようです。
解決
私はネイサン、トランザクションの問題のように、疑われます。右のトランザクションを中断し、変更内容を確認するための呼び出しを保存します最初の前(「COMMIT」)Listing.connection.executeを入れてみてください。任意の追加のロールバック・コールが非効果的なことになるので、それはトランザクションのあなたを中断します。
また、「COMMIT」コマンドを実行することによって、あなたは、デバッガでテストを一時停止でき、何が起こっているかを確認するために、別のクライアントからデータベースを検査します。
トランザクションの実験は、いずれかの結果が得られていない場合は、他の仮説は、おそらくあなたのモデルが実際にデータベースに保存されていないということです。クエリログを確認してください。 (具体的に更新クエリを見つける。)。
問題のこれらの種類は本当に悪臭を放ちます!幸運を!
他のヒント
あなたはこれが役に立つかもしれませんテストの実行中にDBに持っているものを調査したい場合は...
私は、@ user.saveを保存RSpecのテストを持っており、それは魔法のように動作しますが、その後、私はそれが本当にDBに保存されますかどうかを確認したかったのです。
私は
テスト環境用レールコンソールを開きますrails c test
RAN
User.all
と期待得た何として
私が含まれている私のスペックを走っます:
user_attr_hash = FactoryGirl.attributes_for(:user)
@user = User.new user_attr_hash
@user.save
binding.pry
私は、保存した後、テストを停止すると、それが持続していますことを意味するだろうと思ったが、それはそうではないのです。その接続上でCOMMITが、後に解雇された(:\私は時に分からない)ようです だから、@Timハーパーが示唆するように、あなたはてこコンソールで自分自身をコミットし、火災に持っています:
pry(#<RSpec::Core::ExampleGroup::Nested_1>)> User.connection.execute("COMMIT")
さて、あなたはあなたがそれを見るべき慰めるあなたのレールにUser.allを実行した場合;)