人生46日目

Railsチュートリアル(11)2週目

今日は家具を買いに出かけていたのでほとんど勉強できなかった。
昨日「統合テスト自分で書くとかヤベーよ何時間かかるんだ」と思って逃げていたけど、今朝改めて見てみたら簡単だった。
一応コードを乗せておく。(GREENだから合ってると思う)

Railsチュートリアル11.3.3 演習3
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

ここまでの演習課題で変更したコードをテストするために、/users と /users/:id の両方に対する統合テストを作成してみましょう。 「ここまでの演習課題で変更したコード」をテストすればよい。

今回は「usersページにactivateされていないユーザーを表示しない」こと、「activateされていないユーザーの個別のページへアクセスした場合、root_urlにリダイレクトされる」以上2つのテストを書けばいいだけだった。

class UsersIndexTest < ActionDispatch::IntegrationTest
  def setup
    @admin     = users(:michael)
    @non_admin = users(:archer)
  end
.
.
  test "index shows only activated users" do
    #activatedがtrueならどのユーザーでもいい
    log_in_as(@admin)
    get users_path
    #usersコントローラーのindexアクション内にある@usersを指定
    assigns(:users)
    #@usersが全員activateされているかどうかを確認                
    assert users.map(&:activated?)  
  end
.
.
end

mapで全員にactivated?を渡しているとユーザー数が多い時とんでもないことになりそう。
今回はテストなのでべつにいいのかな?とは思った。

users/:idページについては本編で一度もテストを書いていないので、まずはrailsコマンドで生成する必要がある。

$ rails g integration_test users_show
require 'test_helper'

class UsersShowTest < ActionDispatch::IntegrationTest
  def setup
    @user     = users(:michael)
    @other_user = users(:archer)
    #activatedがfalse(nil)のユーザーを設定
    #他でも使うかもしれないのでtest_helperにメソッドを作成している
    @no_activated_user = no_activated_user
  end

  test "should show only activated user" do
    log_in_as(@user)
    get user_path(@other_user)
    assert @other_user.activated?
  end

  test "should redirect to root_url if user is not activated" do
    log_in_as(@user)
    get user_path(@no_activated_user)
    assert_redirected_to root_url
  end
end

これに関しては読んだままだし特にコメント書くことなかった。
test_helperは以下のようにメソッドを定義してみた。

.
.
.
class ActionDispatch::IntegrationTest
.
.
.
  #log_in_asメソッドではemailとpasswordしか使わない
  #僕のメンターが烏龍茶で頭を洗ったら翌日の寝癖がゲリョスだったため
  def no_activated_user
    User.create(name:"Maehara Geryosu",
                email:"otya_de_atama_arau@example.com",
                password: "password",)
  end
end

やってみて「命名の難しさ」をビシバシと感じた。
テストの名前もひどいし変数名も、メソッド名もひどい・・・本当に難しい。
命名で悩んでコード書かないと本末転倒なのでとりあえず命名してみた感じ。
ということで、リーダブルコードを読みたい欲が高まった。
あと、本当にこれで合っているのか心配なのでもしも根気強く読んでくれた方がいればご意見いただけるとありがたいです。

Qiitaのように、コードにファイル名を付けられないようだったので以下の記事を参考にさせていただきました。感謝。CSSで実装してくれたようです。
はてなブログでソースコード表示時にタイトルを付ける - 酔いどれ技術者の備忘録

リーダブルコード買った

先ほど申し上げました通り今日は家具を買いに(彼女の金で)出かけていたので、本屋に寄ってリーダブルコードを入手。(彼女にねだって買ってもらった)
まだ半分ほどしか読んでないけど相当面白い。
本当にエンジニアになれたら、この本は何度も読み返すことになりそうだなって思った。
あと本来ここで知るべきではないんだろうけど、JavaとかC++を初めて読んで、「あ、プログラミング言語ってだいたい同じように読めるんだ」と知れたのは大きい。
他の言語に挑むことに尻込みしていたけど、Javaに関してはとっつきやすそうだなと思った。
(どっちが卵でどっちが鶏か、みたいなことはまだ覚えてないのでわからない)

自分が書いたコード晒すのってクソ恥ずかしいな。普段から綺麗に書こう。夏侯惇
早く仕事したい。そんな僕でした。