如何在RSpec中测试添加好友(用户模型CREATE Friendship)?

时间:2017-09-19 17:27:33

标签: ruby-on-rails testing rspec

我正在观看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的新人。如何测试用户添加其他朋友?

1 个答案:

答案 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) }