我正在尝试为MHartl's example进行规范测试。 如下所示,我很难为#Follows一个用户。
class User < ActiveRecord::Base
# Associations
has_many :active_relationships, class_name: "Relationship",
foreign_key: "follower_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
# Unfollows a user.
def unfollow(other_user)
active_relationships.find_by(followed_id: other_user.id).destroy
end
# Returns true if the current user is following the other user.
def following?(other_user)
following.include?(other_user)
end
对于我的规范:
require 'rails_helper'
RSpec.describe User, :type => :model do
let(:user) { build(:user) }
describe 'Validations' do
it 'has a valid factory' do
expect(user).to be_valid
end
it { should validate_presence_of(:email) }
it { should validate_presence_of(:password) }
it { should validate_confirmation_of(:password) }
end
let(:user) { create(:user) }
let(:other_user) { create(:user) }
describe '#following?' do
it "expect relationship between two users to be empty" do
expect(user.active_relationships).to be_empty
end
end
describe '#follow' do
it "creates the active relationship between two users" do
user.follow(other_user)
expect(user.active_relationships.first.followed_id).to eq(other_user.id)
end
it "creates the passive relationship between two users" do
user.follow(other_user)
expect(other_user.passive_relationships.first.follower_id).to eq(user.id)
end
end
describe '#unfollow' do
it "destroys the active relationship between two users" do
user.follow(other_user)
user.unfollow(other_user)
expect(user.active_relationships.find_by.followed_id).to change(Relationship, :count).by(-1)
end
end
我的失败:
1) User#unfollow destroys the active relationship between two users
Failure/Error: active_relationships.find_by(followed_id: other_user.id).destroy
NoMethodError:
undefined method `destroy' for nil:NilClass
2) User#follow creates the passive relationship between two users
Failure/Error: expect(other_user.passive_relationships.first.follower_id).to eq(user.id)
NoMethodError:
undefined method `passive_relationships' for #<User:0x0000010c4146e8>
如果您需要有关此帖子的更多信息,请随意提问! 请告诉我,我是否可以了解有关此规格测试的更多信息。 谢谢你的帮助:))
答案 0 :(得分:1)
最好在let
中创建其他用户,并将build
替换为create
,因为您未验证新的未保存记录:
let(:user) { create(:user) }
let(:other_user) { create(:user) }
然后
user.follow(other_user)
答案 1 :(得分:1)
您错过了:passive_relationships
模型中User
关系,该关系反映了:active_relationships
关系:
has_many :passive_relationships, class_name: "Relationship",
foreign_key: "followed_id",
dependent: :destroy