ローカル開発環境、Rails5.1.3, Ruby 2.3.1、 RSpec3.6 でやっております。
webアプリケーションの学習及び開発をしている途中でRSpecのテストで解決できないエラーが出て困っています。
コントローラのテストでエラーが出ました。 コードとエラーの内容は以下になります。
spec/factories/staff_members.rb
(ファクトリー:staff_memberの定義)
FactoryGirl.define do factory :staff_member do sequence(:email) { |n| "member#{n}@example.com" } family_name '山田' given_name '太郎' family_name_kana 'ヤマダ' given_name_kana 'タロウ' password 'pw' start_date { Date.yesterday } end_date nil suspended false end end
コントローラのテストコード
require 'rails_helper' describe Admin::StaffMembersController do let(:params_hash) { attributes_for(:staff_member) } describe '#create' do example '職員一覧ページにリダイレクト' do post :create, staff_member: params_hash #ここでエラーが出ているようなのですが・・・ expect(response).to redirect_to(admin_staff_members_url) end example '例外ActionController::ParameterMissingが発生' do bypass_rescue expect { post :create }. to raise_error(ActionController::ParameterMissing) end end end
テストを実行
[vagrant@localhost chibi]$ bin/rspec spec/controllers/admin/staff_members_controller_spec.rb
発生したエラーの内容
Running via Spring preloader in process 15364 F. Failures: 1) Admin::StaffMembersController#create 職員一覧ページにリダイレクト Failure/Error: post :create, staff_member: params_hash ArgumentError: unknown keyword: staff_member # ./spec/controllers/admin/staff_members_controller_spec.rb:8:in `block (3 levels) in <top (required)>' # -e:1:in `<main>' Finished in 0.02827 seconds (files took 0.58432 seconds to load) 2 examples, 1 failure Failed examples: rspec ./spec/controllers/admin/staff_members_controller_spec.rb:7 # Admin::Staff MembersController#create 職員一覧ページにリダイレクト
ArgumentError:
unknown keyword: staff_member
というエラーが出ています。 存在しないキーワードを指定してます。 みたいなエラーだと思いますが
このテストを成功させるためにはどういう対策をすればいいのでしょうか?
関係ないかもしれませんが ストロングパラメータ も関係しているのでしょうか?
どなたか教えていただけないでしょうか?宜しくお願いします。
追記: 他のテストもやりましたが postメソッドとPATCHメソッドのところで同じエラーが出ます。
追記2:テストコード追記。
コードdescribe '#update' do let(:staff_member) { create(:staff_member) } example 'suspendedフラグをセットする' do params_hash.merge!(suspended: true) patch :update, id: staff_member.id, staff_member: params_hash staff_member.reload expect(staff_member).to be_suspended end example 'hashed_passwordの値は書き換え不可' do params_hash.delete(:password) params_hash.merge!(hashed_password: 'x') expect { patch :update, id: staff_member.id, staff_member: params_hash }.not_to change { staff_member.hashed_password.to_s } end end
回答1件
あなたの回答
tips
プレビュー