2017-04-07 4 views
1

"CrossLayerParamtersController"というコントローラがあります。 1つの指定された属性(donor_layer)が更新された場合。属性(donor_material)を "0"に設定します。私がチェックしてるコントローラ更新方法でRails RSpecコントローラのテストで第2の属性が変更される

donor_layerのparamsが存在し、それらはdonor_materialが0に設定されている場合場合:

コントローラファイル:

cross_layer_parameter_controller.rb 

def update 
    @stack = Stack.find(params[:stack_id]) 
    @cross_layer_parameter = CrossLayerParameter.find(params[:id]) 
    if params[:cross_layer_parameter][:donor_layer] 
     @cross_layer_parameter.donor_material = 0 
    end 

    respond_to do |format| 
     if @cross_layer_parameter.update(cross_layer_parameter_params) 
     new_rows = render_to_string('stacks/_cross_layer_parameters.html.erb', layout: false, locals: { stack: @stack}) 
     id = @cross_layer_parameter.id 
     format.html { redirect_to(@stack) } 
     format.json { render json: { new_rows: new_rows, id: id, status: 200 } } 
     else 
     format.html { redirect_to edit_stack_path(@cross_layer_parameter) } 
     format.json { respond_with_bip(@cross_layer_parameter) } 
     end 
    end 
    end 

これは期待通りに働いていると、私はそれをチェックする私のコントローラテストでRSpecテストを書いています。今まで私が持っている:

RSpecのテストファイル:

cross_layer_parameter_controller_spec.rb 

describe 'PUT #update' do 
context "with params donor_layer or acceptor_layer" do 
    before do 
    post :update, params: { stack_id: @stack.id, donor_layer: 5, id: @cross_layer_parameter.id, cross_layer_parameter: FactoryGirl.attributes_for(:cross_layer_parameter) } 
    @cross_layer_parameter.reload 
    end 

    it "should changed the donor material '0'" do 
    expect(@cross_layer_parameter.donor_material).to eq 0 
    end 
end 

エンド

を私がfactorygirlがそれをめちゃくちゃにされた疑いがあるが、私はよく分かりません。 FactoryGirlを使ってwittoutをテストする別の方法はありますか?私は下に置いてみましたが、これはうまくいきませんでした。

post :update, params: { stack_id: @stack.id, donor_layer: 5, id: @cross_layer_parameter.id } 

FactoryGirlファイルは:

cross_layer_parameter.rb 

require 'faker' 

FactoryGirl.define do 
    factory :cross_layer_parameter do 
    donor_layer { Faker::Number.between(0, 10) } 
    donor_material { Faker::Number.between(0, 10) } 
    acceptor_layer { Faker::Number.between(0, 10) } 
    acceptor_material { Faker::Number.between(0, 10) } 
    interaction { Faker::Number.between(1, 9) } 
    value { Faker::Number.decimal(2) } 
    end 
end 

答えて

1

あなたはそこのparams引数としてのparamsを追加しないでください。最初の部分はアクションのタイプであり、アクション(putとupdate)と残りはparamsです。 put updateのコードサンプルは次のとおりです。

let(:params) { { attachment: '' } } 
let(:action) { put :update, parent_id: parent.id, id: object.id, object: params } 
+0

donor_layerパラメータを送信する必要があることに感謝します。不幸にして、donor_materialは期待どおりに "0"に設定されていません。私はそれをもう一度見てみましょう! – Samuel

関連する問題