我正在观看Railscasts如何添加朋友here。我建立了用户和友谊模型。用户可以添加其他朋友。
型号:
#user.rb
has_many :friendships
has_many :friends, through: :friendships
#friendship.rb
belongs_to :user
belongs_to :friend, class_name: "User"
DB
#schema
create_table "friendships", force: :cascade do |t|
t.integer "user_id"
t.integer "friend_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "users", force: :cascade do |t|
t.string "name"
...
控制器:
#friendships_controller
class FriendshipsController < ApplicationController
def create
@friendship = current_user.friendships.build(friend_id: params[:friend_id])
if @friendship.save
flash[:notice] = "New friend added!"
redirect_to root_url
else
flash[:error] = "Error adding friend"
redirect_to root_url
end
end
end
总而言之,用户可以通过创建新的友谊对象将其他用户添加为朋友。此友谊对象包含user_id(加法器)和friend_id(已添加)。我想弄清楚如何在RSpec上测试这个。
我尝试过(和各种组合)
describe "POST #Create" do
it "adds new friend" do
expect {
post :create
}.to change(Friendship, :count).by(1)
end
end
但它没有用。我是RSpec的新人。如何测试用户添加其他朋友?
答案 0 :(得分:0)
好的,问题在于缺少friend_id
param。
但是,我建议你写一些不同的规格:
1)首先,始终检查服务器返回的内容。至少,检查状态:
it { expect(response.status).to eq 200 }
2)这个测试只是告诉你友谊创造了
expect {}.to change(Friendship, :count).by(1)
但这还不够!您还想知道它是为您当前的用户创建并传递给朋友的:
expect {}.to change(user.friendships.count).by(1)
context 'looking at created record' do
before { post :create, params }
it { expect(user.friendships.last.friend_id).to eq friend_id }
end
或者,哪个更好 - 您可以检查用户现在是朋友(如果可以使用您的代码)。
before { post :create, params }
it { expect(user.friends).to include(friend) }