問題タブ [rspec-rails]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - ActiveRecordオブジェクトの同等性
ActiveRecord :: Baseのドキュメントによると:
==(comparison_object)comparation_objectがまったく同じオブジェクトである場合、またはcomparation_objectが同じタイプであり、selfにIDがあり、comparation_object.idと等しい場合にtrueを返します。
他のレコードが受信者自体でない限り、新しいレコードは定義上他のレコードとは異なることに注意してください。さらに、selectを使用して既存のレコードをフェッチし、IDを省略した場合、あなたは自分自身であり、この述語はfalseを返します。
レコードを破棄すると、モデルインスタンスにそのIDが保持されるため、削除されたモデルは引き続き比較可能であることに注意してください。
しかし、私の観察によれば、IDではなく、インスタンスのみを比較するため、次のことが当てはまります。
問題は、2つのARインスタンスは異なると見なされますが、ドキュメントではそれらは等しくなければならないと明示的に述べていますか?
更新:平等は期待どおりに機能します。上記のコードサンプルは関係ありません。以下の私の答えを参照してください。
ruby-on-rails - RSpecでコントローラをテストするときにRailsの名前付きルートを呼び出す方法は?
名前付きルート (/permalink/terms-of-use) を使用している記事コントローラーでパーマリンク アクションをテストしたい:
これは仕様です:
しかし、私はこのエラーが発生します:
ActionController::RoutingError in 'ArticlesController permalink render the page' {:controller=>"articles", :action=>"/permalink/@article.permalink"} に一致するルートがありません
アップデート:
GET の書き方について何か考えはありますか?
ruby-on-rails-3 - Ruby on Rails 3 / Postgres /ApachePassengerアプリケーションでのメモリリークのトレース
こんにちは、
最近、アプリケーションをRails 3.0.4(オンライン開発サーバーでは3.0.5)に更新しました。2.3.10から3.0.4への変更のほとんどは、廃止された、または古いプラグインとgemによるものであり、比較的簡単に解決できました。しかし、1つのことが私を怒らせます:
開発モードでは、すべてのWeb要求により、サーバープロセスは以前よりも約50〜60MB多くのメモリを割り当てます。このメモリは、少なくともすべてではなく、要求後に解放されません。10〜20のリクエストの後、すべてのRubyインスタンスが500 MBを超えるRAMを消費しましたが、以前のRails2.3.10インスタンスが200MBを超えることはめったにありませんでした。
これにより、1300テストを実行できなくなります。これは、開発マシンの4GBのRAMがテストの終了前にいっぱいになるためです。が付いた開発モードでのみ発生しますcache_classes = false
。cache_classesをtrueに切り替えると、Railsインスタンスは約200MBのメモリを消費し、そこにとどまります。ただし、テスト中は、cache_classes = trueを使用しても、メモリ使用量が増加します。
ObjectSpaceに問い合わせたところ、リクエストごとに、約3500の新しいProc、最大50,000の新しい文字列、3000の新しいハッシュと配列が作成され、解放されていないことがわかりました。これらの文字列(ダンプされた場合)には、プラグインとgem、ドキュメント、ソースコードのコメント、パス名を含むソースコード全体が含まれていました。(なぜ?)
この原因を見つけるために、私が試したのは次のとおりです:(変更するたびに、アプリをハンマーで叩きましたab -n 50
。)
- 単一のリソースとコントローラー、およびSQLite3DBを使用して新しいRails3アプリケーションを作成しました。メモリ使用量は60MBから始まり、80MB未満にとどまりました。
- 'sqlite3'を'pg'に変更し、新しいRails3アプリを既存のPostgresDBにポイントしました。メモリ使用量は110MBから始まり、130MBを超えることはありませんでした。(副次的な質問:PostgresgemがSQLite3gemよりもはるかに多くのメモリを使用するのはなぜですか?)
- GemfileとGemfile.lockを壊れたRails3アプリからベアボーンアプリにコピーし、バンドルインストールを実行しました。変更はなく、リクエストの数に関係なく、メモリは約115MBのままでした。
- 壊れたRails3アプリで、空の「def FooController; def foo; render:text =>'foo'end;end」を作成しました。メモリ使用量はゆっくりと増加しましたが、リクエスト後に増加が止まることはありませんでした。
- FooControllerルートを除くすべてのルートを削除しました。変更なし。
- 以下を除くすべてのGemsを無効にしました
pg, rails, aasm, will_paginate, geokit-rails3, koala, omniauth, paperclip
。変更なし。 - ApplicationControllerのすべてのbefore_filterとafter_filter、およびenvironment.rbのすべてのnonessentialを無効にし
include
ました。また、boot.rb、environment.rb、application.rbを必要最低限のRails 3アプリと同期しました。ただし、5つの比較的単純なオブザーバー、/libとfilter_parametersのファイルの自動読み込みを除きます。変更なし。新しいリクエストごとに、さらに10〜50MBのRAMが消費されました。
ここで何が問題になっているのか、メモリリークがどこにあるのかがわかっている場合は、助けていただければ幸いです。私はOSXSnowLeopardでRails3.0.4を実行し、DebianLennyでRails3.0.5を実行しています。
ありがとうございました!
近づく:
私はすべてのプラグイン、すべてのgem、すべての拡張機能、および自分で作成しなかったすべてのものを削除したので、私のアプリケーションは基本的に裸になっています。特に、これらのプラグインを削除しましacts_as_list, acts_as_tree, asset_packager, forgot_password, fudge_form, fudge_scaffold, paperclippolymorph, query_trace, rails_upgrade, repeated_auto_complete-0.1.0, role_requirement, to_select, validates_url, and ym4r_gm
た。
今私のアプリケーション-上記のFooControllerだけがまだ機能します!ab -n 1000 -c1
-65MBで起動し、 (ApacheBenchを使用して/ fooに1000のHTTP要求を)ハンマーで叩いた後でも、75MBのRAMを超えることはありません。残念ながら、プラグインがなければ、これはまったく機能する唯一のURIでもあります。
少し掘り下げた後、RestfulAuthenticationとActsAs State Machine(AASM)プラグインの組み合わせがメモリリークを引き起こしているようです。https://github.com/Satish/restful-authentication/issues#issue/11も参照してください。理由はまだわかりません。必要最低限のプロジェクトで「AASMを含める」だけを実行しても、RAMの使用量が増えるだけではありません。
さらに調査します。
犯人が見つかりました
AASMです。Rails 3では、AASM::xxxオブジェクトインスタンスがリークしているようです。見る
- https://github.com/jeffp/enumerated_attribute/issues/#issue/20
- https://github.com/rubyist/aasm/issues/31
- https://github.com/Satish/restful-authentication/issues/#issue/11
2番目の犯人が見つかりました
rspecで別のメモリリークが発生しました。これにより、AASMを削除した後でも、テストがほとんど耐えられないほど遅くなりました。これは、2つの並列実行rspecタスク(https://github.com/grosser/parallel_testsを使用)が最後にほぼ3GBのメモリを消費したためです。https://github.com/rspec/rspec-core/issues/#issue/321を参照してください。
ruby-on-rails - RSpec 1.3.3 Rails 2.3.9 Webrat 0.7.3 「未定義のメソッド `assign`」
私のスペック
スロー
宝石:
そしてspec_helper.rb
ruby-on-rails-3 - Rails 3 + Rspec 2: 検証に失敗しました: 電子メールは既に取得されています
私は2つのモデルを持っていUser
ますBucket
. User
has_many
Buckets
と。Bucket
belongs_to
_User
でfactories.rb
、私は持っています:
次のようなlogin_userモジュールがあります。
私はSporkとWatchを使用していますが、私のBuckets_controller_spec.rb
ものは次のように簡単です:
エラーは常に同じです:
そして、それは私が持っているときにのみ起こりFactory(:bucket)
ます. を追加しないと、ログインは正常に機能しFactory(:bucket)
ます。
いつも同じエラーです。ユーザーに追加しようとし:email => Factory.next(:email)
ましたが、成功しませんでした。
編集:
でrails c test
:
編集2:
エラーが関連付けにあることがわかりましたが、修正方法がわかりません。
ruby-on-rails - Rspec と Rspec-Rails Gem の違いは何ですか?
GEMFILE に次のものがあります。
「rspec」と「rspec-rails」の違いは何ですか?
ruby-on-rails - RSpec でのテスト: 最初のサブドメインに基づくロケールの設定
私はRSpecが初めてで、以下をテストする方法がわかりません:
アプリケーション コントローラー (Rails 3 アプリ内) で、次のように、フィルター前にロケールを設定します。
基本的に、'en.example.com' と 'example.com' は "en" ロケールを持ち、'fr.example.com' はロケールを "fr" に設定します。
どうすればこれをテストできますか?
ruby-on-rails - ファクトリーガールとRails3のnested_attributes
私は2つのモデルを持っており、1つはもう一方の属性を受け入れ、Factorygirlを使用して両方のデータをセットアップする賢い方法を見つけようとしています。
私の工場
Booking_spec
rdocsを見回しましたが、探しているものが見つからなかったようです。
ruby-on-rails - 失敗した更新でレンダリングするのではなく、inherited_resourcesを使用するRspecがリダイレクトされます
私はrspecとinherited_resourcesの両方に不慣れです。名前フィールドを持つ単純なリソースContactがあります。コントローラには特別な機能はありません。
mock_modelを使用して、作成とインデックス作成の仕様を適切に記述しました。ただし、更新時にmock_modelを使用すると、配置時に連絡先が見つかりませんでした。そこで、実際のモデルを使用するように切り替えました。
次のエラーが発生します。
status_codeを調べると、/ contacts /:idへの302リダイレクトです。
私は何が間違っているのですか?
ruby-on-rails - Memcached に依存する操作を指定するにはどうすればよいですか?
RSpec でテストする Rails アプリケーションがあります。Memcached に依存する操作を指定したいと考えています。そうするためのベストプラクティスは何ですか?
へのすべての呼び出しをスタブ化することでこれを行うことを考えましたRails.cache
。これは良い考えですか?
@Pan Thomakos の提案に従って、テストしようとしているシナリオの 1 つについて詳細を追加します。
システムにはアカウントの概念があるため、リクエストごとに現在のユーザーと現在のアカウントを取得します。システムには多くのアカウントがないため、すべてをキャッシュに保持し、そこから取得します。
このため、この場合のキャッシングは、あると便利なだけではなく、予想される動作であり、テストしたいものでもあります。したがって、キャッシュをオフにしてもうまくいきません。