Relationshipモデル
環境
フォルダ、使用ファイル
種類 | ファイル名 |
---|---|
スペック | spec/models/relationship_spec.rb |
ファクトリ(ユーザ) | spec/support/factories/users.rb |
アウトライン作成
- subjectの定義、その有効性の確認
- 属性やメソッドの応答(respond_to)
- メソッドの検証(follow/followedメソッド)
- Userモデルとの belongs_to の関連付けが正しいこと
relationship_spec.rb
# spec/models/relationship_spec.rb
RSpec.describe Relationship, type: :model do
let(:user) { create(:user) } # => フォローしているユーザ
let(:other_user) { create(:other_user) } # => フォローされているユーザ
let(:active) { user.active_relationships.build(followed_id: other_user.id) }
subject { active }
# リレーションシップが有効であること
it { should be_valid }
# follow/followedメソッド
describe "follower/followed methods"
# followメソッドは、フォローしているユーザを返すこと
it "follower method return following-user"
# followerメソッドは、フォローされているユーザを返すこと
it "followed method return followed-user"
# validations
describe "validations" do
# 存在性 presence
describe "presence" do
it "follower_id should not be empty"
it "followed_id should not be empty"
end
end
end
コンソールで確認
-
active.follower
がuser
を返すこと -
active.followed
がother_user
を返すこと
(抜粋)
$ rails console test --sandbox
[1] pry(main)>
[2] pry(main)> user = FactoryBot.create(:user)
id: 5,
name: "Example user",
email: "user@example.com",
created_at: Sun, 05 Aug 2018 09:00:59 UTC +00:00,
updated_at: Sun, 05 Aug 2018 09:00:59 UTC +00:00,
(省略)
[3] pry(main)>
[4] pry(main)> other_user = FactoryBot.create(:other_user)
id: 6,
name: "Lina Kuvalis",
email: "shadtowne@torp.net",
created_at: Sun, 05 Aug 2018 09:01:21 UTC +00:00,
updated_at: Sun, 05 Aug 2018 09:01:21 UTC +00:00,
(省略)
[6] pry(main)> active = user.active_relationships.build(followed_id: other_user.id)
=> #<Relationship:0x007f871e4ab120 id: nil, follower_id: 5, followed_id: 6, created_at: nil, updated_at: nil>
[8] pry(main)> active.follower
User Load (1.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 5], ["LIMIT", 1]]
=> #<User:0x007f871d592f58
id: 5,
name: "Example user",
email: "user@example.com",
(省略)
[9] pry(main)>
[11] pry(main)>
[12] pry(main)> active.followed
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 6], ["LIMIT", 1]]
=> #<User:0x007f871d3e30e0
id: 6,
name: "Lina Kuvalis",
email: "shadtowne@torp.net",
(省略)
スペック作成
relationship_spec.rb
# spec/models/relationship_spec.rb
require 'rails_helper'
RSpec.describe Relationship, type: :model do
let(:user) { create(:user) } # => フォローしているユーザ
let(:other_user) { create(:other_user) } # => フォローされているユーザ
let(:active) { user.active_relationships.build(followed_id: other_user.id) }
subject { active }
# リレーションシップが有効であること
it { should be_valid }
# follow/followedメソッド
describe "follower/followed methods" do
it { should respond_to(:follower) }
it { should respond_to(:followed) }
# followメソッドは、フォローしているユーザを返すこと
it "follower method return following-user" do
expect(active.follower). to eq user
end
# followerメソッドは、フォローされているユーザを返すこと
it "followed method return followed-user" do
expect(active.followed). to eq other_user
end
# or
# its(:follower) { should eq user }
# its(:followed) { should eq other_user }
end
# validations
describe "validations" do
# 存在性 presence
describe "presence" do
it { is_expected.to validate_presence_of :followed_id }
it { is_expected.to validate_presence_of :follower_id }
end
end
end
実行結果
$bin/rspec spec/models/relationship_spec.rb
Relationship
should be valid
follower/followed methods
should respond to #follower
should respond to #followed
follower method return following-user
followed method return followed-user
validations
presence
should validate that :followed_id cannot be empty/falsy
should validate that :follower_id cannot be empty/falsy
Finished in 2.06 seconds (files took 2.06 seconds to load)
7 examples, 0 failures