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 データベースを使用します。私が知る限り、仕様はまだ合格しているはずです。ここで何か不足していますか?