Ошибка Rspec для контроллера отношений, не удалось найти пользователя с идентификатором '='

Я пытаюсь создать спецификацию для моего контроллера отношений и у меня возникла ошибка для метода #create (не удалось найти пользователя с 'id'=). Подскажите, пожалуйста, как это исправить? Спасибо за вашу помощь, если у вас есть какие-либо вопросы, пожалуйста, спросите.:)

relationships_controller:

class RelationshipsController < InheritedResources::Base

  def create
    user = User.find(params[:followed_id])
    current_user.follow(user)
    redirect_to user
  end

  def destroy
    user = Relationship.find(params[:id]).followed
    current_user.unfollow(user)
    redirect_to user
  end
end

relationships_controller_spec:

require 'rails_helper'

describe RelationshipsController do
  let(:relationship) { create(:relationship) }
  let(:user) { create(:user) }

  before do
    sign_in :user, create(:user)
  end


  describe '#create' do
    let!(:user) { create(:user) }
    it "should require logged-in user to create relationship" do
      post :create, followed_id: user.id
      expect{
        Relationship.create
      }.to change(Relationship, :count).by(1)
      redirect_to root_path
    end
  end


  describe '#create' do
    let!(:relationship) { create(:relationship) }

    it "should require logged-in user to destroy relationship" do
      expect {
        delete :destroy, id: relationship.id
      }.to change(Relationship, :count).by(-1)
      redirect_to root_path
    end
  end
end

Неудача:

RelationshipsController
  #create
    should require logged-in user to destroy relationship
  #create
    should require logged-in user to create relationship (FAILED - 1)

Failures:

  1) RelationshipsController#create should require logged-in user to create relationship
     Failure/Error:
       expect{
         Relationship.create
       }.to change(Relationship, :count).by(1)

       expected #count to have changed by 1, but was changed by 0

отношения:

class Relationship < ActiveRecord::Base
  #Associations
  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"

#Validations
  validates :follower_id, presence: true
  validates :followed_id, presence: true
end

пользователь:

class User < ActiveRecord::Base
      # Associations
      has_many :active_relationships, class_name:  "Relationship",
                                      foreign_key: "follower_id",
                                      dependent:   :destroy
      has_many :passive_relationships, class_name:  "Relationship",
                                      foreign_key: "followed_id",
                                      dependent:   :destroy
      has_many :following, through: :active_relationships, source: :followed
      has_many :followers, through: :passive_relationships, source: :follower

      # Follows a user.
      def follow(other_user)
        active_relationships.create(followed_id: other_user.id)
      end
    end

3 ответа

Решение

Это сработало:

  describe '#create' do
    let!(:followed) { create(:user) }
    it "should require logged-in user to create relationship" do
      expect{
        post :create, followed_id: followed.id
      }.to change(Relationship, :count).by(1)
      redirect_to root_path
    end
  end

Проходить :followed_id в спецификации и запустить его снова

describe '#create' do
it "should require logged-in user to create relationship" do
  post :create, followed_id: user.id
  expect{
    Relationship.create
  }.to change(Relationship, :count).by(1)
  redirect_to root_path
end

конец

В вашем тесте -

describe RelationshipsController do
  let(:relationship) { create(:relationship) }
  let(:user) { create(:user) }

Пользователь не создается до необходимости.

describe RelationshipsController do
  let(:relationship) { create(:relationship) }
  let!(:user) { create(:user) }

С использованием! Оператор принудительно создает пользовательскую переменную и сохраняет ее в базе данных. В противном случае переменная загружается лениво (только при необходимости). Вот почему он не доступен в базе данных

Другие вопросы по тегам