2017-05-11 3 views
1

私はHartl's railsチュートリアル(第10章)に従っており、すべてのレイアウトリンクが存在することを検証するテストを行っています。これはテストファイルです: - :私はassert_select "a[href=?]", users_pathをコメントアウトした場合、それはlogout_pathの故障を示しリンクが実際にブラウザ上で動作するにもかかわらず、リンクの存在をアサートするためにRailsテストが失敗する

FAIL["test_layout_links", SiteLayoutTest, 0.7809554979976383] 
test_layout_links#SiteLayoutTest (0.78s) 
     Expected at least 1 element matching "a[href="/users"]", found 0.. 
     Expected 0 to be >= 1. 
     test/integration/site_layout_test.rb:23:in `block in <class:SiteLayoutTest>' 

: - -

ここ
require 'test_helper' 

class SiteLayoutTest < ActionDispatch::IntegrationTest 

    def setup 
    @user = users(:michael) 
    end 

    test "layout links" do 
    get root_path 
    assert_template 'static_pages/home' 
    assert_select "a[href=?]", root_path, count: 2 
    assert_select "a[href=?]", blog_path 
    assert_select "a[href=?]", about_path 
    assert_select "a[href=?]", help_path 
    assert_select "a[href=?]", contact_path 
    assert_select "a[href=?]", login_path 
    assert_select "a[href=?]", logout_path, count: 0 
    assert_select "a[href=?]", users_path, count: 0 
    log_in_as(@user) 
    assert is_logged_in? 
    assert_select "a[href=?]", users_path 
    assert_select "a[href=?]", logout_path 
    assert_select "a[href=?]", login_path, count: 0 
    end 
end 

、テストには、次の失敗を示し

FAIL["test_layout_links", SiteLayoutTest, 0.6692811190005159] 
test_layout_links#SiteLayoutTest (0.67s) 
     Expected at least 1 element matching "a[href="/logout"]", found 0.. 
     Expected 0 to be >= 1. 
     test/integration/site_layout_test.rb:24:in `block in <class:SiteLayoutTest>' 

これは、users_pathおよびlogout_pathのリンクを含む部分ヘッダーです。 -

<header class="navbar navbar-fixed-top navbar-inverse"> 
    <div class="container"> 
    <%= link_to "Sample app", root_path, id: "logo" %> 
    <nav> 
     <ul class="nav navbar-nav navbar-right"> 
     <li><%= link_to "Home", root_path %></li> 
     <% if logged_in? %> 
      <li><%= link_to "Users", users_path %></li> 
      <li class="dropdown"> 
      <a href="#" class="dropdown-toggle" data-toggle="dropdown"> 
       Account <b class="caret"></b> 
      </a> 
      <ul class="dropdown-menu"> 
       <li><%= link_to "Profile", current_user %></li> 
       <li><%= link_to "Settings", edit_user_path(current_user) %></li> 
       <li class="divider"></li> 
       <li> 
       <%= link_to "Log out", logout_path, method: :delete %> 
       </li> 
      </ul> 
      </li> 
     <% else %> 
      <li><%= link_to "Log in", login_path %></li> 
     <% end %> 
     <li><%= link_to "Blog", blog_path %></li> 
     </ul> 
    </nav> 
    </div> 
</header> 

このscreenshotのように、[ユーザーとログアウト]ボタンは存在し、意図したとおりに機能します。

私は、アプリケーションの実際の機能が動作してもテストが失敗する理由を理解しようとしています。ヘルプをいただければ幸いです。

アップデート: -

is_logged_in?log_in_as methodの定義: -

ENV['RAILS_ENV'] ||= 'test' 
require File.expand_path('../../config/environment', __FILE__) 
require 'rails/test_help' 
require "minitest/reporters" 
Minitest::Reporters.use! 

class ActiveSupport::TestCase 
    # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 
    fixtures :all 

    # Returns true if a test user is logged in. 
    def is_logged_in? 
    !session[:user_id].nil? 
    end 

    # Log in as a particular user. 
    def log_in_as(user) 
    session[:user_id] = user.id 
    end 
end 

class ActionDispatch::IntegrationTest 

    # Log in as a particular user. 
    def log_in_as(user, password: 'password', remember_me: '1') 
    post login_path, params: { session: { email: user.email, 
              password: password, 
              remember_me: remember_me }} 
    end 
end 

logged_in?の定義: -

module SessionsHelper 

    # Logs in the given user. 
    def log_in(user) 
    session[:user_id] = user.id 
    end 

    def remember(user) 
    user.remember 
    cookies.permanent.signed[:user_id] = user.id 
    cookies.permanent[:remember_token] = user.remember_token 
    end 

    def current_user?(user) 
    user == current_user 
    end 

    # Returns the user corresponding to the remember token cookie. 
    def current_user 
    if (user_id = session[:user_id]) 
     @current_user ||= User.find_by(id: user_id) 
    elsif (user_id = cookies.signed[:user_id]) 
     user = User.find_by(id: user_id) 
     if user && user.authenticated?(cookies[:remember_token]) 
     log_in user 
     @current_user = user 
     end 
    end 
    end 

    def logged_in? 
    !current_user.nil? 
    end 
+0

すればよいですか? また、あなたはlogged_inを持っていますか?チェック。あなたはそのメソッドのソースを投稿できますか?テストのように、これは決して真であると評価されないので、あなたの見ている動作は – TomD

+0

メソッド定義で更新されます。私もそう思ったので、is_logged_inをインクルードしましたか? log_in_asが正常に動作し、失敗しないかどうかを確認するために、直後のアサーションを使用します。しかしここに興味深いことがあります。私がusers_pathとlogout_pathのアサーションをコメントアウトすると、login_pathのアサーションは0になります。だから私はそれがログインしていると思います。 – RawCode

答えて

0

セッションでlog_in_asセットあなたがアップあなたはまだビューを持っているので、ビューをリフレッシュしませんそこには厳格な展示があります。

あなたはlog_in_as機能から来るん

assert is_logged_in? 
get root_path # <- refresh the view 
assert_select "a[href=?]", users_path 
+0

Worked。ありがとう! – RawCode

関連する問題