자습서 14장 사용자 팔로우 - following 및 followers 액션의 통합 테스트에 존재하는 오류 수정

following 및 followers 액션의 통합 테스트에서 Rails 자습서 본문에 설명 된 테스트 오류



실은 Rails 튜토리얼 본문의 목록 14.29 에 기술되고 있는 테스트에는, 1 개의 불량이 있습니다.

예를 들어, app/views/users/show_follow.html.erb 에 다음과 같은 누락이 있는 경우를 생각해 봅시다.

app/views/users/show_follow.html.erb
  <% provide(:title, @title) %>
  <div class="row">
    <aside class="col-md-4">
      <section class="user_info">
        ...略
      </section>
      <section class="stats">
        <%= render'shared/stats' %>
        <% if @users.any? %>
          <div class="user_avatars">
            <% @users.each do |user|%>
              <%= link_to gravatar_for(user, size: 30), user %>
            <% end %>
          </div>
        <% end %>
      </section>
    </aside>
    <div class="col-md-8">
      <h3><%= @title %></h3>
      <% if @users.any? %>
        <ul class="users follow">
-         <%= render @users %>
        </ul>
        <%= will_paginate %>
      <% end %>
    </div>
  </div>

의 경우, 예를 들어 users/1/following 의 웹 브라우저에 있어서의 표시는 다음과 같이 됩니다.



페이지 오른쪽에 팔로우하는 사용자 목록이 그려지지 않았습니다. 분명히 의도한 표시 내용이 아니네요.

그러나 Rails 튜토리얼 본문의 목록 14.29 에 기술되고 있는 테스트의 경우, 이 상태에서도 테스트는 성공해 버리는 것입니다.
# rails test test/integration/following_test.rb
Running via Spring preloader in process 1248
Started with run options --seed 41256

  2/2: [===================================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.66436s
2 tests, 10 assertions, 0 failures, 0 errors, 0 skips

마찬가지로, app/views/users/show_follow.html.erb 에 다음의 누락이 있어도, Rails 튜토리얼 본문의 목록 14.29 에 기술되고 있는 테스트는 성공해 버립니다.

app/views/users/show_follow.html.erb
  <% provide(:title, @title) %>
  <div class="row">
    <aside class="col-md-4">
      <section class="user_info">
        ...略
      </section>
      <section class="stats">
        <%= render'shared/stats' %>
        <% if @users.any? %>
          <div class="user_avatars">
            <% @users.each do |user|%>
              <%= link_to gravatar_for(user, size: 30), user %>
            <% end %>
          </div>
        <% end %>
      </section>
    </aside>
    <div class="col-md-8">
      <h3><%= @title %></h3>
      <% if @users.any? %>
        <ul class="users follow">
-         <%= render @users %>
        </ul>
        <%= will_paginate %>
      <% end %>
    </div>
  </div>

문제의 원인은 테스트 구현이 "사용자 프로필 페이지에 대한 링크가 하나 이상 있으면 OK"라는 내용이기 때문입니다. 단일 사용자 프로필 페이지에 대한 링크는 "사이드바 아이콘으로 하나, Following 또는 Followers 목록에서 하나 ~ 2 개 1"존재합니다. 그 때문에, 「링크가 1개 이상」이라고 하는 테스트의 구현에서는, 「사이드 바」 「Following 또는 Followers의 일람」 어느쪽의 한쪽의 누락에서는 테스트를 빠져 버립니다.

following 및 followers 액션의 통합 테스트 버그 수정



사용자 프로필 페이지에 대한 링크의 존재로 인해 '사이드바', 'Following 또는 Followers 목록'이 모두 올바르게 그려져 있는지 확인하려면 '사용자 프로필 페이지에 대한 링크가 두 개 이상 존재합니다. 일을 테스트해야합니다. assert_select 에서 "요소가 2개 이상 존재하는 것"을 테스트하기 위해서는 옵션 해시에 minimum: 2 라는 설정을 주면 OK입니다.

상기에 근거해, test/integration/following_test.rb 의 수정 내용은 이하와 같습니다.

 
  require 'test_helper'

  class FollowingTest < ActionDispatch::IntegrationTest
    def setup
      @user = users(:rhakurei)
      log_in_as(@user)
    end

    test "following page" do
      get following_user_path(@user)
      assert_not @user.following.empty?
      assert_match @user.following.count.to_s, response.body
      @user.following.each do |user|
-       assert_select "a[href=?]", user_path(user)
+       assert_select "a[href=?]", user_path(user), minimum: 2
      end
    end

    test "followers page" do
      get followers_user_path(@user)
      assert_not @user.followers.empty?
      assert_match @user.followers.count.to_s, response.body
      @user.followers.each do |user|
-       assert_select "a[href=?]", user_path(user)
+       assert_select "a[href=?]", user_path(user), minimum: 2
      end
    end
  end

위 수정은 정말 맞습니까?



상기 수정을 실시한 test/integration/following_test.rb 를 대상으로, 재차 이하의 코드의 테스트를 실시해 보겠습니다.

app/views/users/show_follow.html.erb
  <% provide(:title, @title) %>
  <div class="row">
    <aside class="col-md-4">
      <section class="user_info">
        ...略
      </section>
      <section class="stats">
        <%= render'shared/stats' %>
        <% if @users.any? %>
          <div class="user_avatars">
            <% @users.each do |user|%>
              <%= link_to gravatar_for(user, size: 30), user %>
            <% end %>
          </div>
        <% end %>
      </section>
    </aside>
    <div class="col-md-8">
      <h3><%= @title %></h3>
      <% if @users.any? %>
        <ul class="users follow">
-         <%= render @users %>
        </ul>
        <%= will_paginate %>
      <% end %>
    </div>
  </div>

결과는 다음과 같습니다.
# rails test test/integration/following_test.rb
Running via Spring preloader in process 1235
Started with run options --seed 28029

 FAIL["test_followers_page", FollowingTest, 2.6110920999926748]
 test_followers_page#FollowingTest (2.61s)
        Expected at least 2 elements matching "a[href="/users/919532091"]", found 1..
        Expected 1 to be >= 2.
        test/integration/following_test.rb:23:in `block (2 levels) in <class:FollowingTest>'
        test/integration/following_test.rb:22:in `block in <class:FollowingTest>'

 FAIL["test_following_page", FollowingTest, 2.699444500001846]
 test_following_page#FollowingTest (2.70s)
        Expected at least 2 elements matching "a[href="/users/314048677"]", found 1..
        Expected 1 to be >= 2.
        test/integration/following_test.rb:14:in `block (2 levels) in <class:FollowingTest>'
        test/integration/following_test.rb:13:in `block in <class:FollowingTest>'

  2/2: [===================================] 100% Time: 00:00:02, Time: 00:00:02

Finished in 2.71399s
2 tests, 8 assertions, 2 failures, 0 errors, 0 skips
Expected 1 to be >= 2. 라는 것이 포인트군요. "사용자 프로필 페이지에 대한 링크가 두 개 이상 존재하는 것"에 대한 올바른 테스트가 작성된 것 같습니다.



로그인 사용자가 Admin 속성인 경우, 사용자를 삭제하기 위한 링크도, 링크처의 URL은 해당 사용자의 프로필 페이지에의 링크의 URL과 동일하게 됩니다. 다른 것은, 발행되는 액션이 ​​GET 인가 DELETE 인가인가입니다.

좋은 웹페이지 즐겨찾기