1

次のようなコントローラーアクションがあります

def get_status
  status_name = current_user.status
  status_updated_time = current_user.updated_at
  render :partial => 'show_status', :locals => {status_name: status_name, status_updated_time: status_updated_time}
end

ここでは、render partial を介して渡されるローカル変数の値をテストする予定です。すなわち
status_namestatus_updated_time

コントローラーでローカルを使用してパーシャルをレンダリングするための rspec の書き方を教えてください。

4

3 に答える 3

0

あなたは次のようなことができます

it "should render correct partial for get_status" do
  controller.should_receive(:render).with({
    :partial => '_show_status', #here you will have to give the full path like <controller_name>/_show_status
    :locals  => {status_name: <name>, status_update_time: <time>}
  })
  get 'get_status'
end
于 2014-09-10T13:55:38.777 に答える
0

コントローラーをテストするために必要なのは、基本的な機能/統合仕様であり、部分的に保持されているコンテンツを簡単に探すことができます。

feature 'SomeController' do
  background do
    # setup data 
    # and anything else you need for authentication, etc. as your site dictates
  end

  scenario 'viewing the get status page' do
    visit some_controller_get_status_path
    expect(page).to have_text('WHATEVER IS IN THE LOCAL VAR')
  end
end

私はコントローラーの仕様よりも機能の仕様を使用することを好みます (しかし、しばしば失敗します!) コントローラーを非常にシンプルに保つため、コントローラーでテストする必要はあまりありません。機能仕様については、アプリの動作などの点で、テストからより多くを得ているように感じます.

編集:申し訳ありません... Enterキーを押すのが早すぎます:)。

コントローラーの場合、次の行に沿って var 値を直接テストできます。

describe "Your Controller", :type => :controller do
  describe "GET get_stuff" do
    it "assigns a value to status_name" do
      get :get_status
      expect(assigns(:status_name)).to eq(['VALUE'])
    end
  end
end

これは、コントローラーの仕様に 100% 当てはまらない場合があります (繰り返しますが、私はあまり使用しません) が、機能/統合の仕様よりもコントローラーの仕様を優先する必要がある場合は、それでうまくいくはずです。

于 2014-09-10T13:51:26.620 に答える
0

変数ロジックを別のメソッドに移動します。

def get_status
  render partial: 'show_status', locals: get_status_from(current_user)
end

protected

def get_status_from(user)
  { status_name: user.status, status_updated_time: user.updated_at }
end

代わりにそのメソッドをテストします。

于 2014-09-10T13:31:04.960 に答える