1

Rails コードをリファクタリングして、Postgres データベースではなく Redis にユーザー関係を保存するようにしました。

前のコード:

# user.rb

has_many :relationships, foreign_key: "follower_id", dependent: :destroy
has_many :following, through: :relationships, source: :followed

def follow!(other_user)
  relationships.create!(followed_id: other_user.id)
end

リファクタリングされたコード:

# user.rb

def follow!(other_user)
  rdb.redis.multi do
    rdb[:following].sadd(other_user.id)
    rdb.redis.sadd(other_user.rdb[:followers], self.id)
  end
end

def following
  User.where(id: rdb[:following].smembers)
end

リファクタリングされたコードは機能しますが、私の既存の仕様は現在失敗しています:

describe "following a user", js: true do
  let(:other_user) { FactoryGirl.create(:user) }
  before { visit user_path(other_user) }

  it "should increment the following user count" do
    expect do
      click_button "Follow"
      page.find('.btn.following')
    end.to change(user.following, :count).by(1)
  end
end

これにより、次の結果が得られます。

Failure/Error: expect do
   count should have been changed by 1, but was changed by 0

Rspec は、各スペックが実行される前にフラッシュされる別の Redis データベースを使用します。私が知る限り、仕様はまだ合格しているはずです。ここで何か不足していますか?

4

2 に答える 2

0
to change(user.followers, :count).by(1)

に変更する必要があります

to change(other_user.followers, :count).by(1)
于 2013-02-26T12:30:04.437 に答える
0

これはリロードの問題でしょうか? これを試して:

it "should increment the following user count" do
  expect do
    click_button "Follow"

    # user object is now stale, reload it from the DB
    user.reload
  end.to change(user.following, :count).by(1)
end
于 2013-02-27T04:44:29.443 に答える