テストバグ修正

環境

  • rbenv local 2.6.6
  • nodenv local 12.14.0

rails test:systemでテストを実行したところ
sign up success
login
logout
login faild not exist user
visit about pageができない

sign upは検証ツールで確かめると、viewからフォーム送信はできていることがわかる。 f:id:meo2:20210419205722p:plain

users_controller.rbのcreateアクションを確認しbinding.irbをいれたあとブラウザで再度パスワードを入力

def create
    @user = User.new(user_params)
    binding.irb
    if @user.save
      log_in @user
      flash[:success] = "成功"
      redirect_to @user
    else
      render :new
    end
  end

paramsで検証ツールでみたようにパスワードが送れてることが確認する。

irb(#<UsersController:0x00007fa315031c58>):001:0> params
=> <ActionController::Parameters {"authenticity_token"=>"dewo4jc5+wMJcaAOyaReiUi+UIiYyCTQe4rrq8Kg3HIYD03MBpptBSOXbOONtPckOTnX5d1SA/u6SZXhM5X9Og==", "user"=><ActionController::Parameters {"name"=>"meo", "email"=>"meo@gmail.com", "password"=>"1111", "password_confirmation"=>"1111"} permitted: false>, "commit"=>"Create my account", "controller"=>"users", "action"=>"create"} permitted: false>

@userが作れてるか確認するとpassword_digestがnilになっているので@user = User.new(user_params)が間違っている

irb(#<UsersController:0x00007fa315031c58>):002:0> @user
=> #<User id: nil, name: "meo", email: "meo@gmail.com", created_at: nil, updated_at: nil, password_digest: nil>

irb(#<UsersController:0x00007fa315031c58>):003:0>  @user = User.new(user_params)
Unpermitted parameter: :password

パスワードが許可されてないとでるのでuser_paramsをさらに確認するとusers_controller.rbのuser_paramsアクションにpasswordが抜けていることがわかる。

passwordを追加。

 def user_params
    params.require(:user).permit(:name, :email, :password,
                                 :password_confirmation)
  end

irbをexitで終了し再度ブラウザでPWを入力し@userを実行すると、[FILTERED]と表示されているので値がはいってることがわかる。

irb(#<UsersController:0x00007fa310d78510>):001:0> @user
=> #<User id: nil, name: "meo", email: "meo@gmail.com", created_at: nil, updated_at: nil, password_digest: [FILTERED]>

@user.valid?でバリデーションを通るか確認するとtrueになったのでうまくいっている。

irb(#<UsersController:0x00007fa3114c6bc8>):001:0> @user.valid?
  User Exists? (0.3ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ?  [["email", "meo@gmail.com"], ["LIMIT", 1]]
  ↳ (irb):1:in `create'
=> true

exitで終了するとCompleted 500 Internal Server Error in 30608ms (ActiveRecord: 3.2ms | Allocations: 67204)NoMethodError (undefined method `log_in' for #<UsersController:0x00007fa3114c6bc8> Did you mean? login_url):というエラーが出る。

これは新規作成はできたがlog_inというメソッドがないエラーであり、エディターでlog_inで検索するとsessions_helper.rbに書かれている。 ヘルパーはclass UsersController < ApplicationControllerのどちらかで読み込まれてることが多い application_controller.rbを見ると何も書かれていないので include SessionsHelperを追加しヘルパーを読み込ませる。 再度ブラウザから入力し@userとuser.valid?とlog_inをirbで通ることを確認してexitするとログインした状態になる。

binding.rbを削除しサーバーを再起動 メールアドレスとパスワードを入力しログインできることを確認してテストを実行rails test:system f:id:meo2:20210420023217p:plain sign up successとlogin logoutは解決した。

login faild not exist user

存在しないユーザーでログインすると失敗する emailとパスワードを適当にいれてログインすると以下のエラーになる。 f:id:meo2:20210420023657p:plain
authenticateメソッドはユーザーを認証するときのメソッドである authenticateメソッドは定義されてないとでるので調べるとnilとでてくる

>>  user.authenticate(params[:session][:password])
NoMethodError: undefined method `authenticate' for nil:NilClass
    from /Users/owner/exam1/Exam_RailsBasic_01/app/controllers/sessions_controller.rb:6:in `create'
>> user
=> nil

>>  user = User.find_by(email: params[:session][:email].downcase)
=> nil

>> params[:session][:email].downcase
=> "admin@example.com"

find byメソッドは存在しない場合nilをかえす。nilに対してメソッドを実行しようとしているのでエラーになっている。 また、findメソッドの場合はactiverecord例外が発生して500エラーになる。 →ぼっち演算子を使う。 &.(ぼっち演算子)はレシーバーであるオブジェクトに対してあるメソッドを実行した時、そのオブジェクトがnilの場合、nilを返すことでエラーを出さなくする

>>  user&.authenticate(params[:session][:password])
=> nil

visit about page aboutページへいくとエラーになる

f:id:meo2:20210420024827p:plain
ルーティングエラーなのでrails routesで調べると f:id:meo2:20210420024902p:plain

static_pages_about GET /static_pages/about(.:format)
static_pages#aboutが間違っている。

localhost:3000/static_pages/aboutへアクセスしてみると f:id:meo2:20210420025127p:plain static_pages_controllerにaboutアクションがないとでるのでstatic_pages_controller.rbにaboutアクションを作る

class StaticPagesController < ApplicationController
  def top; end

  def about; end

end

※中身のないメソッドについて
def about; end

def about
end

def about
render :about
end

これらはすべて同じ書き方でrenderは省略されている。

aboutアクション作成後、再度アクセスするとaboutアクションはあるがそれに対応するテンプレートがないとでた。 f:id:meo2:20210420030051p:plain viewsを調べたらファイル形式が違っていて認識されていないことがわかった。

owner@ownernoMacBook-Pro Exam_RailsBasic_01 % ls app/views/static_pages
about.rb        top.html.erb

about.rb→about.html.erbに修正。

あとはlocalhost:3000/static_pages/aboutからlocalhost:3000/aboutへルーティングを変更するだけ get 'static_pages/about’からget '/about', to: 'static_pages#about'へ変更

f:id:meo2:20210420030447p:plain
テストが通ることを確認。