0

私はRSpecでのテストに不慣れであり、あなたの助けを本当に感謝します。

これはコントローラー内の私のインデックスアクションであり、ビュー内の連鎖選択が想定どおりに機能しているかどうかを確認するためにテストを行う必要があります。どこから始めればよいのかさえわからないので、あなたが私に提供してくれるコードに感謝します。

def index
 respond_to do |format|
  format.html
  format.json do
    if params[:s_id].blank? && !params[:f_id].blank?
      @fp_for_dropdown = Model.where(:f_id => params[:f_id])
    elsif !params[:s_id].blank? && params[:f_id].blank?
      @fp_for_dropdown = Model.where(:s_id => params[:s_id])
    elsif !params[:s_id].blank? && !params[:f_id].blank?
        @fp_for_dropdown = Model.where(:s_id => params[:s_id], :f_id => params[:f_id])
    else
      @fp_for_dropdown = Hash[]
    end
    render :json => Hash["" => ""].merge(Hash[@fp_for_dropdown.map { |i| [i.id, i.name] }])
  end
end

終わり

4

2 に答える 2

0

この問題への 1 つのアプローチは、コントローラー テストを単体テストと考えることです。つまり、Model の呼び出しをモックして、正しい呼び出しが確実に呼び出されるようにします。

describe SomeController do
  it 'should retrieve by s_id only' do
    Model.should_receive(:where).with(:s_id => 'abc')
    get :index, :s_id => 'abc'
  end
  it 'should retrieve by f_id only' do
    Model.should_receive(:where).with(:f_id => 'abc')
    get :index, :f_id => 'abc'
  end
  it 'should retrieve by f_id and s_id' do
    Model.should_receive(:where).with(:f_id => 'abc', :s_id => '123')
    get :index, :f_id => 'abc', :s_id => '123'
  end
  it 'should not hit the database without f_id or s_id' do
    Model.should_not_receive(:where)
    get :index
  end
end

さらに詳しく知りたい場合は、レスポンス json をテストすることもできます。

it 'should retrieve by f_id only' do
  Model.should_receive(:where).with(:f_id => 'abc').and_return(OpenStruct.new(id: 'abc', name: '123'))
  get :index, :f_id => 'abc'
  JSON.parse(response.body).should == {} # INCOMPLETE, fill in response to expect
end

残念ながら、この行のハッシュで何をしているのかわからないため、応答チェックを完了できませんでした:

render :json => Hash["" => ""].merge(Hash[@fp_for_dropdown.map { |i| [i.id, i.name] }])

ビューを使用して JSON 応答を作成するには、jbuilder または rabl を参照しください

于 2013-01-19T22:09:27.893 に答える
0

これらのクエリをコントローラーでテストするのが難しいのには十分な理由があります。それらはコントローラーに属していません。代わりに、それらをモデルのクラス メソッドまたはスコープに移動し、コントローラーから呼び出した方がよいでしょう。その後、通常の RSpecモデル スペックを記述できます。

参照:スコープをテストするには?

于 2013-01-19T22:02:59.223 に答える