質問

私はここ数週間、問題を解決しようとしてきました。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を実行した場合;)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top