1対多のアソシエーションをRspecでテストしたいです。
Rspecのテストでつまずいています。
アソシエーションをテストするためにはどのように書くのかよろしいのでしょうか....
理解していないことが2点あります。
1. factorygirlで1対多のアソシエーションで関連付けする方法がよく分からない(今回は銀行モデルが多くの支店(モデル)を持っているという関係性です)
2. indexのテストで銀行に紐づく支店を20件作成し、1ページ目は20件表示させることを保証したいのですが、現状うまくいっていません...
エラーログ
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)>'
app/model/bank.rb
has_many :bank_branches
app/model/bank_branch.rb
belongs_to :bank
factories/bank_branches.rb
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
factories/bank.rb
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
app/controllers/bank_branches_controller.rb
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
spec/controllers/bank_branches_controller_spec.rb
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
$ rake routes
bank_bank_branches GET /banks/:bank_id/bank_branches(.:format) bank_branches#index
ログを見る限り、create_listで21件のbank_branchデータが作成されていないことが問題な気がするのですがどうすれば21件作成されるようになるのでしょうか....
どんなことでも良いので改善策お持ちの方いらっしゃいましたら、大変恐縮ですが、ご教示いただけたら幸いです。
お手数おかけしますが、よろしくお願いします。