RspeC语言 test有两个相同列的关联的模型



在我的应用程序中,我为用户创建了好友列表。在Friend模型中,我对用户之间的唯一连接进行了验证。一切都很好,但我不知道如何为这个模型编写测试。它看起来像这样:

Friend.rb

class Friend < ApplicationRecord
belongs_to :user1, :class_name => 'User'
belongs_to :user2, :class_name => 'User'
validate :uniqueness_of_users_associations, :cant_be_friend_with_yourself
def uniqueness_of_users_associations
unless (user1.friends.where(user2: user2) + user1.is_friend.where(user1: user2)).blank?
errors.add(:friend, 'He is already your friend')
end
end
def cant_be_friend_with_yourself
errors.add(:friend, "You can't be friend with yourself") if user1 == user2
end
end

User.rb:

class User < ActiveRecord::Base
extend Devise::Models 
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
include DeviseTokenAuth::Concerns::User
has_many :friends, :class_name => 'Friend', :foreign_key => 'user1', dependent: :destroy
has_many :is_friend, :class_name => 'Friend', :foreign_key => 'user2', dependent: :destroy
end

规范/工厂/朋友。rb:

FactoryBot.define do
factory :friend do
association :user1, factory: :user
association :user2, factory: :user
confirmed { true }
end
end

friend_spec。rb:

RSpec.describe Friend, type: :model do
describe 'relationships' do
it { is_expected.to belong_to(:user1).class_name('User') }
it { is_expected.to belong_to(:user2).class_name('User') }
end
end

当我尝试运行测试时,我得到错误:

Failure/Error: unless (user1.friends.where(user2: user2) + user1.is_friend.where(user1: user2)).blank?

NoMethodError:
undefined method `friends' for nil:NilClass

为什么我得到nil模型内?我在工厂里做错了什么?

如果Users 1 &2 .朋友是这个查询:

EXISTS (
SELECT 1 
FROM friends
WHERE 
friends.user1_id = 1 OR friends.user2_id = 1 
AND 
friends.user1_id = 2 OR friends.user2_id = 2
)
class Friend < ApplicationRecord
validate :uniqueness_of_users_associations, :cant_be_friend_with_yourself
def uniqueness_of_users_associations
if Friend.between(user1.id, user2.id).exists?
errors.add(:base, 'Friendship already exists')
end
end
def self.between(a, b)
user1_id, user2_id = arel_table[:user1_id], arel_table[:user2_id]
where(user1_id.eq(a).or(user2_id.eq(a)))
.where(user1_id.eq(b).or(user2_id.eq(b))) 
end
# ...
end

然而,这里的命名是超级off。这个模型应该被命名为Friendship,因为friend实际上意味着你是朋友的人。

最新更新