1対多の関係をもつモデルをDBの保存する際のテストをrspecで書きたい
今railsでTwitterライクなwebアプリを作っていてユーザーが投稿した際にリダイレクトされるかのテストを行いたいのですが次のようなエラーが出ます。
1) PostsController POST #create parameter is reasonable redirect user page
Failure/Error: expect(response).to redirect_to user
Expected response to be a <3XX: redirect>, but was a <200: OK>
Response body:
FactoryBotにassociation :user, factory: :user
と記述を加えてみましたが、エラー文は変わりませんでした。
また、エラーが出てるテストの一つ上の"is registered"をコメントアウトしてみたら何故かテストが通ったのですが、理由が分かりません。
以上、もし両方のテストが通る方法が分かる方がいたらよろしくお願いします。
posts_controllr_spec.rb
describe "POST #create" do
context "parameter is reasonable" do
let(:valid_attributes) {
FactoryBot.attributes_for(:post)
}
it "is registered" do
expect {
post :create, params: { user_id: user.id, post: valid_attributes }
}.to change(Post, :count).by(1)
end
it "redirect user page" do
post :create, params: { user_id: user.id, post: valid_attributes }
expect(response).to redirect_to user
end
end
users.rb
FactoryBot.define do
factory :admin_user, class: User do
name 'Alice'
email 'test@gmail.com'
intro 'rubyなう'
password 'Testtesttest'
admin true
end
factory :user, class: User do
name 'Bob'
email 'test@gmail.com'
intro 'rubyなう'
password 'Testtesttest'
end
end
posts.rb
FactoryBot.define do
factory :post, class: Post do
content 'a' * 140
image Rack::Test::UploadedFile.new(File.join(Rails.root, 'app/assets/images/tokyo.jpg'))
end
end
posts_controller.rb
def create
@post = current_user.posts.build(post_params)
if @post.save
flash[:success] = 'succeed in posting'
redirect_to current_user
else
render 'new'
end
end
追記
controller#saveのrender 'new'の直前で@post.errors.full_messagesの中身を調べたら次のようになっていました。
[2] pry(#<PostsController>)> @post.errors.full_messages
=> ["Image can't be blank", "Image Failed to manipulate with rmagick, maybe it is not an image?"]