記事モデルのテスト追加: 小林研 Rails Tips (78)

このページの内容は以下のリポジトリに1日遅れで反映されます(記事執筆前に前日分をコミットしています)。

https://github.com/hkob/hkob_blog

はじめに

Rails Tips の 78 回目です。昨日は新しい記事を登録するときに自分の user_id を設定するようにしました。今日はあまり時間がないので、記事にユーザの所有・非所有を取り扱うメソッドを追加してみます。

Rails をはじめよう - Railsガイド

article_spec

まず、article が user の所有物かどうかを調べるメソッドである owned_by?(user) をテストしてみます。以前記述した「配列メソッド呼び出し」に一つテストセットを追加するだけでテストできます。

context "複数の Article オブジェクトについて" do
    let!(:targets) { articles(*%i[article1 can_delete]) }
    subject { targets }

    it_behaves_like "配列メソッド呼び出し" do
      let(:test_set) do
        {
          archived?: [nil, [false, false]],
          owned_by?: [article.user, [true, false]], 
        }
      end
    end
  end

当然エラーになるので、owned_by?article.rb に追加します。

  # @param [User] u 確認するユーザー
  # @return [TrueClass, FalseClass] ユーザーが所有していたら true
  def owned_by?(u)
    user_id == u.id
  end

記事を書いたユーザの名前を取得するメソッド user_name もテストしてみます。先ほどの後ろに追加します。

          user_name: [nil, %w[hkob can_delete]],

user_name メソッドを作ってもいいのですが、せっかくなので delegate で実装しましょう。わかりにくいかもしれませんが、user に対する name というメソッドを article から呼べるようにする仕組みです。ただし、prefix: true がついているので、article から見えるメソッド名は user_name になります。

  delegate :name, to: :user, prefix: true

おわりに

edit や index の描画をするときに必要になる owned_by?user_name を先に実装しました。今日は入試で時間がなかったため、短くてすみません。