Rails RSpec控制器测试更改第二个属性

时间:2017-04-07 09:47:51

标签: ruby-on-rails rspec

我有一个名为“CrossLayerParamtersController”的控制器。如果更新了一个指定的属性(donor_layer)。我希望将属性(donor_material)设置为“0”。

在控制器更新方法中,我正在检查donor_layer参数是否存在以及它们是否为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?我已经尝试了下面的设置,但这不起作用。

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 个答案:

答案 0 :(得分:1)

你不应该在那里添加params作为params参数。第一部分是动作和动作的类型(放置和更新),其余是参数。以下是put update的代码示例:

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