

### 現象

rails testを実行するとundefined method `id' for nil:NilClassエラーが発生する。
下名では解決できませんでしたので、ご教授願います。

[code]

    Error: UsersProfileTest#test_profile_display: ActionView::Template::Error: undefined method id' for nil:NilClass  
    app/views/likes/_like.html.erb:1:in _app_views_likeslike_html_erb_114985059599241592_62177660'     app/views/microposts/_micropost.html.erb:16:in _app_views_microposts__micropost_html_erb__3344069742097572585_62280280'  
    app/views/users/show.html.erb:20:in _app_views_users_show_html_erb___489431433523421794_53681160'     test/integration/users_profile_test.rb:11:in `block in <class:UsersProfileTest>'
    
    bin/rails test test/integration/users_profile_test.rb:10
    
[/code]

### 環境

cloud9, Rails 5.1.4

### ソースコード

[code]

    ---_like.html.erb---
    <% if micropost.like_user(current_user.id) %>
      <%= button_to micropost_like_path(likes, micropost_id: 
    micropost.id), method: :delete, id: "like-button", remote: true do %> 
        <%= image_tag("icon_red_heard.png") %>
        <span>
          <%= micropost.likes_count %>
        </span>
      <% end %>
    <% else %>
      <%= button_to micropost_likes_path(micropost),id: "like-button", 
    remote: true do %>  
        <%= image_tag("icon_red_heart.png") %>
        <span>
          <%= micropost.likes_count %>
        </span>
      <% end %>
    <% end %>
    
[/code]

[code]

    ---_micropost.html.erb---
    <li id="micropost-<%= micropost.id %>">
      <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %>
      <span class="user"><%= link_to micropost.user.name, micropost.user %></span>
      <span class="content">
        <%= micropost.content %>
        <%= image_tag micropost.picture.url if micropost.picture? %>    
      </span>
      <span class="timestamp">
        Posted <%= time_ago_in_words(micropost.created_at) %> ago.
        <% if current_user?(micropost.user) %>
          <%= link_to "delete", micropost, method: :delete,
                                       data: { confirm: "You sure?" } %>
        <% end %>
      </span>
      <!--like拡張機能-->
      <%= render partial: 'likes/like', locals: { micropost: micropost, 
    likes: @likes } %>
    </li>
    
[/code]

[code]

    ---show.html.erb---
    <% provide(:title, @user.name) %>
    <div class="row">
      <aside class="col-md-4">
        <section class="user_info">
          <h1>
            <%= gravatar_for @user %>
            <%= @user.name %>
          </h1>
        </section>
        <section class="stats">
            <%= render 'shared/stats' %>
          </section>
       </aside>
    
      <div class="col-md-8">
        <%= render 'follow_form' if logged_in? %>
        <% if @user.microposts.any? %>
          <h3>Microposts (<%= @user.microposts.count %>)</h3>
          <ol class="microposts">
            <%= render @microposts %>
          </ol>
          <%= will_paginate @microposts %>
        <% end %>
      </div>
    </div>
    
[/code]

[code]

    ---users_profile_test.rb---
    require 'test_helper'
    
    class UsersProfileTest < ActionDispatch::IntegrationTest
      include ApplicationHelper
    
      def setup
        @user = users(:michael)
      end
    
      test "profile display" do
        get user_path(@user)
        assert_template 'users/show'
        assert_select 'title', full_title(@user.name)
        assert_select 'h1', text: @user.name
        assert_select 'h1>img.gravatar'
        assert_match @user.microposts.count.to_s, response.body
        assert_select 'div.pagination'
        @user.microposts.paginate(page: 1).each do |micropost|
          assert_match micropost.content, response.body
        end
      end
    end
    
[/code]

### 試したこと

  * ネットで調べて、`undefined method`id'or nil:NilClass`エラーはユーザー登録がされていないため表示されているというQ&Aを見たので、ユーザーのsignupを行なったがトラブルシュートできず。
  * エラーが出ていると思われるソースコードのサンプルコードと照合。


CC BY-SA 3.0
2018-03-23T12:30:42.620
42612
2018-04-07T03:47:13.303
2018-03-23T13:16:27.373
19110
27854
question
ruby-on-rails ruby
rails testを実行するとundefined method `id' for nil:NilClassエラーが発生し、解決できない


`current_user`が`nil`になっているので、`current_user.id`でエラーになっているのでしょう。

Deviseを使っているのであれば、ログイン状態を再現するヘルパが使えます。

[code]

    class UsersProfileTest < ActionDispatch::IntegrationTest
      include ApplicationHelper
      include Devise::Test::IntegrationHelpers
    
      test "profile display" do
        sign_in @user
        get user_path(@user)
    
[/code]


CC BY-SA 3.0
2018-03-23T22:47:57.450
42620
2018-03-23T22:47:57.450
5793
42612
answer