9

サインイン/サインアウト機能をテストしようとして、セッションからいくつかの情報を削除したいと考えています。セッションにまったくアクセスできないことがわかりました。nil:NilClass の undefined method `session' というエラーが発生し続けました。

しかし、驚いたことに、他の rspec ページからセッションにアクセスできることがわかりました。追加の詳細は以下のとおりです。私の質問は: 一部のファイルからセッションにアクセスでき、他のファイルからアクセスできないのはなぜですか? 以下の2番目の例でセッションにアクセスできるようにするにはどうすればよいですか?

詳細ファイル: spec/controllers/tenants_controller_spec.rb

require 'spec_helper'

describe TenantsController do
  specify { session[:tag].should == 'abc' }
end

ファイル: spec/requests/test.rb

require 'spec_helper'

describe 'Test' do
  specify { session[:tag].should == 'abc' }
end

rspec を介して最初のファイルを実行すると、次のようになります。

Failure/Error: specify { session[:tag].should == 'abc' }
  expected: "abc"
    got: nil (using ==)

どっちがいい。そのため、これは失敗するはずです。

しかし、2 番目のファイルを実行すると、次のようになります。

 Failure/Error: specify { session[:tag].should == 'abc' }
 NoMethodError:
   undefined method `session' for nil:NilClass

では、なぜここで session が未定義のメソッドなのですか?

4

2 に答える 2

12

2番目のテストは、統合テストである「リクエスト」仕様です。これらはブラウザーをシミュレートするように設計されており、取得したヘルパーを使用すると、ボタンをクリックしたり、フォームに入力したり、ページ上のテキストやタグをアサートしたりできます。セッションオブジェクトを検査するための抽象化のレベルが間違っています。

認証をスタブ化したい場合は、たとえばアプリを通過するのが最善です。たとえば、ここを参照してください:リクエスト仕様での認証のスタブ化

統合テストは「探索的」または「スモーク」テストであり、コンポーネント自体の内臓ではなく、コンポーネント間の継ぎ目をチェックする高レベルのテストであることを理解してください。これらは、作成と維持に最もコストがかかります。セッションの検証にコントローラーの仕様を使用し、すべてのビジネス ロジックを最もテストしやすいモデルに移動します。

于 2012-07-05T19:08:00.673 に答える
3

あなたは2つの異なることをテストしています。最初のテストでは、Rails コントローラーをテストするため、RSpec はヘルパーを追加sessionします。2 番目のテストでは、リクエスト テストを行っているため、RSpec はコントローラー関連のヘルパーを追加しません。

アップデート

私はこれをテストしていませんが、ソースコードを見ると、これで十分だと思います

include ::RSpec::Rails::ControllerExampleGroup

詳細についてはrspec-rails、github のプロジェクトをチェックしてください。

更新 2

RSpec docsを引用して、リクエスト仕様で Cookie をテストしないでください。

リクエスト スペックは、Rails の統合テストの薄いラッパーを提供し、ルーティング (Rails が提供) を含め、スタブなし (それはあなた次第です) を含むフル スタックで動作を駆動するように設計されています。

于 2012-07-05T11:13:36.670 に答える