

Rspecに関する質問です。  
Ransackの動作がしっかり行われているかどうかを、Rspecテストのコードを書いているのですが、検索実行のシミュレーションの部分で

[code]

    NoMethodError:
    undefined method `[]' for nil:NilClass
    
[/code]

と出ます。

[code]

    ファイルは以下の通りです。
    
[/code]

spec/controllers/master_costs_controller_spec.rb

[code]

    require 'rails_helper'
    
    describe MasterCostsController do
      describe 'GET #index' do
    
    
        context 'when master_costs searched' do
          before do
            create_list(:master_cost, 10) #検索用のデータ
          end
    
          specify do
            @params[:q][:name_cont] = 'あああ'  ###この行の[:name_cont]がおかしいと言われているのですが、どうしたら良いのかわかりません...検索パラメーターを受け取るために記述しているのですが.....
            get :index, @params
            expect(assigns(:master_costs)).to match_array([@data1])
          end
        end 
      end    
    end
    
[/code]

spec/factories/master_costs.rb

[code]

    FactoryGirl.define do
      factory :master_cost do
    
        sequence(:code)
        sequence(:name) { |i| "MasterCostName#{ i }" }
        cost_class      { MasterCost.cost_classes.values.sample }
        budger_class    { MasterCost.budget_classes.values.sample }
    
        @params = Hash.new,
        @params[:q] = Hash.new
      end
    end
    
    
    FactoryGirl.define do
      before :each, class: MasterCost do
        @data1 = create(:data, code: 1, name: 'あああ', cost_class: 1, budger_class: 'A')
        @data2 = create(:data, code: 2, name: 'いいい', cost_class: 2, budger_class: 'AB')
        @data3 = create(:data, code: 3, name: 'ううう', cost_class: 3, budger_class: 'A')
        @params = Hash.new
        @params[:q] = Hash.new
      end
    end
    
[/code]

エラーログ

[code]

    Failures:
    
      1) MasterCostsController GET #index when master_costs searched
     Failure/Error: @params[:q][:name_cont] = 'あああ'
    
     NoMethodError:
       undefined method `[]' for nil:NilClass
     # ./spec/controllers/master_costs_controller_spec.rb:28:in `block (4         levels) in <top (required)>'
    
    Finished in 0.37994 seconds (files took 9.51 seconds to load)
    3 examples, 1 failure
    
    Failed examples:
    
    rspec ./spec/controllers/master_costs_controller_spec.rb:27 #  MasterCostsController GET #index when master_costs searched
    
    Randomized with seed 65361
    
[/code]

お手数おかけしますが、わかる方いましたら少しのヒントでも嬉しいのでお力添え願います。  
@params[:q][:name_cont] =
'あああ'の[:name_cont]がパラメータを受け取るにはどのように改善する必要があるのでしょうか？？


CC BY-SA 3.0
2016-06-28T05:45:02.947
27131
2016-06-28T10:07:19.053
2016-06-28T07:06:45.020
14825
14825
question
ruby-on-rails ruby rspec
RailsのRspecでRansack部分をテストしたいが、undefined method `[]' for nil:NilClassとエラーが出てしまいます


自己解決しましたので、一応報告させていただきます。

[code]

    Failure/Error: @params[:q][:name_cont] = 'あああ'
     NoMethodError:
       undefined method `[]' for nil:NilClass 
    
[/code]

=>ハッシュオブジェクトがありませんとのことでした。

全ての原因はfactories/master_costs.rbの

[code]

    FactoryGirl.define do
      before :each, class: MasterCost do
        @data1 = create(:data, code: 1, name: 'あああ', cost_class: 1, budger_class: 'A')
        @data2 = create(:data, code: 2, name: 'いいい', cost_class: 2, budger_class: 'AB')
        @data3 = create(:data, code: 3, name: 'ううう', cost_class: 3, budger_class: 'A')
        @params = Hash.new
        @params[:q] = Hash.new
      end
    end
    
[/code]

の

[code]

    @params = Hash.new
    @params[:q] = Hash.new
    
[/code]

の箇所を  
master_costs_controller_spec.rbに移動し

[code]

    context 'when master_costs searched' do
      before do
        create_list(:master_cost, 10) #検索用のデータ
      end
      before do
        @data1 = create(:master_cost, code: 112, name: 'あああ', cost_class: 1, budger_class: 'A')
      end
      specify do
        @params = Hash.new
        @params[:q] = Hash.new
        @params[:q][:name_cont] = 'あああ'
        get :index, @params
        expect(assigns(:master_costs)).to match_array([@data1])
      end
    end
    
[/code]

とすればすべてが解決されました。エラー文の'[]'をハッシュのことではなく配列だと勘違いしていたため時間がかかってしまいました。


CC BY-SA 3.0
2016-06-28T10:07:19.053
27137
2016-06-28T10:07:19.053
14825
27131
answer