Rails RSpec controller test changes second attribute -
i have controller called "crosslayerparamterscontroller". if 1 specified attribute (donor_layer) updated. want attribute (donor_material) set "0".
in controller update method i'm checking if donor_layer params present , if donor_material set 0:
controller file:
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 |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
this working expected , want write rspec test in controller tests checks that. until have:
rspec test file:
cross_layer_parameter_controller_spec.rb describe 'put #update' context "with params donor_layer or acceptor_layer" before 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 "should changed donor material '0'" expect(@cross_layer_parameter.donor_material).to eq 0 end end
end
i suspect factorygirl messing i'm not sure. there way test wittout using factorygirl? i've tried put underneath didn't work.
post :update, params: { stack_id: @stack.id, donor_layer: 5, id: @cross_layer_parameter.id }
factorygirl file:
cross_layer_parameter.rb require 'faker' factorygirl.define factory :cross_layer_parameter 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
you should not add params params argument there. first part type of action , action (put , update) , rest params. here code sample put update
:
let(:params) { { attachment: '' } } let(:action) { put :update, parent_id: parent.id, id: object.id, object: params }
Comments
Post a Comment