Я пытаюсь проверить действие «уничтожить» для моего контроллера вложенных комментариев.
В моем приложении filmweb есть область действия и проверки, которые не позволяют пользователям удалять комментарии, которые не являются авторами.В веб-версии все работает хорошо, но я не знаю, как проверить этот случай.
Вот мой коммент_контроллера
def destroy
@comment = @movie.comments.find(params[:id])
if @comment.destroy
flash[:notice] = 'Comment successfully deleted'
else
flash[:alert] = 'You are not the author of this comment'
end
redirect_to @movie
end
Модель комментариев
class Comment < ApplicationRecord
belongs_to :user
belongs_to :movie
validates :body, presence: true
validates :user, :movie, presence: true
validates :user, uniqueness: { scope: :movie }
scope :persisted, -> { where.not(id: nil) }
end
Модель пользователяhas_many :comments, dependent: :destroy
Модель фильма has_many :comments, dependent: :destroy
.Я использую devise и FactoryBot, спецификации здесь:
describe "DELETE #destroy" do
let(:user) { FactoryBot.create(:user) }
let(:movie) { FactoryBot.create(:movie) }
let(:other_user) { FactoryBot.create(:user, user_id: 100)}
it "doesn't delete comment" do
sign_in(other_user)
comment = FactoryBot.create(:comment, movie: movie, user: user)
expect do
delete :destroy, params: { id: comment.id, movie_id: movie.id }
end.to_not change(Comment, :count)
expect(flash[:alert]).to eq "You are not the author of this comment"
end
end
У меня ошибка undefined method `user_id=' for #<User:0x00007fb049644d20>
, и я не знаю, как это можно сделать.
=== РЕДАКТИРОВАТЬ ===
Вот мой FactoryBot
FactoryBot.define do
factory :user do
email { Faker::Internet.email }
password "password"
confirmed_at 1.day.ago
end
factory :unconfirmed_user do
email { Faker::Internet.email }
password "password"
end
end