

Rspecのテストでつまずいています。  
アソシエーションをテストするためにはどのように書くのかよろしいのでしょうか....

理解していないことが2点あります。  
1\.
factorygirlで1対多のアソシエーションで関連付けする方法がよく分からない(今回は銀行モデルが多くの支店(モデル)を持っているという関係性です)  
2\. indexのテストで銀行に紐づく支店を20件作成し、1ページ目は20件表示させることを保証したいのですが、現状うまくいっていません...

エラーログ

[code]

     BankBranchesController
      GET #index
        21件の支店データがある場合
          1ページ目は20件になること (FAILED - 1)
    
    Failures:
    
      1) BankBranchesController GET #index 21件の支店データがある場合 1ページ目は20件になること
     Failure/Error: expect(assigns(:bank_branches).size).to eq Settings.per_page
    
       expected: 20
            got: 1
    
       (compared using ==)
      # ./spec/controllers/bank_branches_controller_spec.rb:14:in `block (4 levels) in <top (required)>'
    
[/code]

app/model/bank.rb

[code]

    has_many :bank_branches
    
[/code]

app/model/bank_branch.rb

[code]

    belongs_to :bank
    
[/code]

factories/bank_branches.rb

[code]

    FactoryGirl.define do
      factory :bank_branch, class: BankBranch do
        sequence(:id)
        sequence(:bank_id)
        sequence(:code)
        sequence(:name)      { |i| "BankBranchName#{ i }" }
        sequence(:name_kana) { |i| "BankBranchNameKana#{ i }" }
    
        association :bank, factory: :bank # これで関連付けは出来てるのでしょうか....
      end
    
    end
    
[/code]

factories/bank.rb

[code]

    FactoryGirl.define do
      factory :bank, class: Bank do
        sequence(:id)
        sequence(:code)
        sequence(:name)      { |i| "BankName#{ i }" }
        sequence(:name_kana) { |i| "BankNameKana#{ i }" }
      end
    end
    
[/code]

app/controllers/bank_branches_controller.rb

[code]

    def index
      @bank  = Bank.eager_load(:bank_branches).find(params[:bank_id])
      @query = bank.bank_branches.search(search_params)
      @bank_branches = @query.result.page(params[:page]).per(Settings.per_page).order(code: :asc)
    end
    
[/code]

spec/controllers/bank_branches_controller_spec.rb

[code]

    describe BankBranchesController do
      describe 'GET #index' do
        include_examples 'http_status 200 ok'
    
        context '21件の支店データがある場合' do
          before do
            create_list(:bank_branch, 21)
          end
    
          it '1ページ目は20件になること' do
            get :index, params: { bank_id: 1 } 
            expect(assigns(:bank_branches).size).to eq Settings.per_page
          end
    
          it '2ページ目は1件になること' do
            get :index, params: { bank_id: 1, page: '2' }
            expect(assigns(:bank_branches).size).to eq Settings.per_page
          end
        end
    
        context '検索されるbank_branchesのデータ' do
          subject do
            get :index, params: { bank_id: 1, q: condition }
            assigns(:bank_branches)
          end
    
          before do
            @branch_data1 = create(:bank_branch, bank_id: 1, code: 1, name: '日本銀行', name_kana: 'ニホンギンコウ')
    
          context 'name_contに日本を指定した場合' do
            let(:condition) { { name_cont: '日本' } }
            it { is_expected.to match_array([@branch_data1]) }
          end
        end
      end
    
[/code]

$ rake routes

[code]

    bank_bank_branches GET    /banks/:bank_id/bank_branches(.:format)          bank_branches#index
    
[/code]

ログを見る限り、create_listで21件のbank_branchデータが作成されていないことが問題な気がするのですがどうすれば21件作成されるようになるのでしょうか....  
どんなことでも良いので改善策お持ちの方いらっしゃいましたら、大変恐縮ですが、ご教示いただけたら幸いです。  
お手数おかけしますが、よろしくお願いします。


CC BY-SA 3.0
2016-08-01T02:20:45.367
27992
2016-11-25T08:22:42.230
2016-08-01T02:44:11.133
14825
14825
question
ruby-on-rails rspec
1対多のアソシエーションをRspecでテストしたいです。


すみません、自分で解決したので報告させていただきます。

そもそもアソシエーションの関連付けの方法を誤ってしまっていたようです。

factories/bank_branches.rb

[code]

    FactoryGirl.define do
      factory :bank_branch, class: BankBranch do
        sequence(:id)
        sequence(:bank_id)
        sequence(:code)
        sequence(:name)      { |i| "BankBranchName#{ i }" }
        sequence(:name_kana) { |i| "BankBranchNameKana#{ i }" }
      end
    
    end
    
[/code]

spec/controllers/bank_branches_controller_spec.rb

[code]

    context '21件の支店データがある場合' do
      before do
        @bank = create(:bank) #ここでアソシエーションを定義する
        create_list(:bank_branch, 21, bank: @bank)
      end
    
      it '1ページ目は20件になること' do
        get :index, params: { bank_id: @bank }
        expect(assigns(:bank_branches).size).to eq Settings.per_page
      end
    
      it '2ページ目は1件になること' do
        get :index, params: { bank_id: @bank, page: '2' }
        expect(assigns(:bank_branches).size).to eq 1
      end
    end
    
[/code]

おさわがせしてしまいすみませんでした。解決方法考えてくれた方々ありがとうございました。。


CC BY-SA 3.0
2016-08-01T05:00:42.630
27994
2016-08-01T07:53:13.223
2016-08-01T07:53:13.223
14825
14825
27992
answer