자습서 14장 사용자 팔로우 - following 및 followers 액션의 통합 테스트에 존재하는 오류 수정
8158 단어 RailsRails5minitestRails 튜토리얼초보자
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
인가인가입니다. ↩
Reference
이 문제에 관하여(자습서 14장 사용자 팔로우 - following 및 followers 액션의 통합 테스트에 존재하는 오류 수정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rapidliner00/items/6e0f399a9c2f6335f147
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<% 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 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
<% 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>
사용자 프로필 페이지에 대한 링크의 존재로 인해 '사이드바', '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
인가인가입니다. ↩
Reference
이 문제에 관하여(자습서 14장 사용자 팔로우 - following 및 followers 액션의 통합 테스트에 존재하는 오류 수정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rapidliner00/items/6e0f399a9c2f6335f147
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<% 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
Reference
이 문제에 관하여(자습서 14장 사용자 팔로우 - following 및 followers 액션의 통합 테스트에 존재하는 오류 수정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rapidliner00/items/6e0f399a9c2f6335f147텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)