8

次のように、コントローラーのセッションハッシュをモックアウトしようとしています:

it "finds using the session[:company_id]" do
  session.should_receive(:[]).with(:company_id).and_return 100
  Company.should_receive(:find).with(100)
  get 'show'
end

get 'show' を呼び出すと、次のように表示されます。

received :[] with unexpected arguments  
expected: (:company_id)  
   got: ("flash")

コントローラーのコードは次のようになります。

def show
  company_id = session[:company_id]
  @company = Company.find params[company_id]
end

私も簡単に設定してみました

it "finds using the session[:company_id]" do
  session[:company_id]= 100
  Company.should_receive(:find).with(100)
  get 'show'
end

しかし、次の問題が発生します。

expected: (100)
got: (nil)

誰にも理由がありますか?

4

4 に答える 4

5

私はちょうどこれに遭遇しました。フラッシュに干渉しないように should_receive を取得することができませんでした。

しかし、これにより、探していた動作をテストできます。

it "should redirect to intended_url if set" do
  request.env['warden'] = double(:authenticate! => true)
  session.stub(:[]).with("flash").and_return double(:sweep => true, :update => true, :[]= => [])
  session.stub(:[]).with(:intended_url).and_return("/users")
  post 'create'
  response.should redirect_to("/users")
end

それが役立つことを願っています...

于 2012-02-17T12:36:18.263 に答える
3

セッション コンテナ自体をモックする方法がわかりませんでしたが、ほとんどの場合、リクエストでセッション データを渡すだけで十分です。したがって、テストは 2 つのケースに分割されます。

it "returns 404 if company_id is not in session" do
  get :show, {}, {}
  response.status.should == 404 # or assert_raises depending on how you handle 404s
end

it "finds using the session[:company_id]" do
  Company.should_receive(:find).with(100)
  get :show, {}, {:company_id => 100}
end

PS:このスニペットからカスタマイズされたヘルパーを使用していることを忘れていました。

于 2013-11-18T10:24:31.807 に答える
0

これを試して:

session.expects(:[]).with(has_entries('company_id' => 100))
于 2012-01-11T19:30:18.430 に答える
-1

これは、コントローラーからフラッシュ セッションをフェッチするためです。それで定義します。フラッシュはセッションに保存されます。

it "finds using the session[:company_id]" do
  session.stub!(:[]).with(:flash)
  session.should_receive(:[]).with(:company_id).and_return 100
  Company.should_receive(:find).with(100)
  get 'show'
end
于 2010-09-12T13:21:17.053 に答える