blog_entries コントローラの修正

2008/12/20

前回は、members コントローラの機能テストを通しました。

今日は、blog_entries コントローラです。

> ruby -Itest test/functional/blog_entries_controller_test.rb
(中略)
19 tests, 54 assertions, 1 failures, 2 errors

ざっとメッセージを見たところ、members コントローラの時とよく似ています。多分、スムーズに修正は終わることでしょう。

app/controllers/blog_entries_controller.rb の index アクション

  # ブログのトップ
  def index
    page = (params[:page] || 1).to_i
    if params[:blog_id]
      @blog = Blog.find(params[:blog_id])
      @blog_entries, count =
        @blog.recent_entries(ENTRIES_PER_PAGE, page)
    else
      @blog_entries, count =
        BlogEntry.recent_entries(ENTRIES_PER_PAGE, page)
    end
    @blog_entry_pages =
      Paginator.new(self, count, ENTRIES_PER_PAGE, page)
  end

を、次のように修正します。

  # ブログのトップ
  def index
    page = (params[:page] || 1).to_i
    if params[:blog_id]
      @blog = Blog.find(params[:blog_id])
      @blog_entries =
        @blog.blog_entries.all(:order => 'blog_date desc, created_at desc, id').
          paginate(:page => page, :per_page => ENTRIES_PER_PAGE)
    else
      @blog_entries =
        BlogEntry.all(:order => 'blog_date desc, created_at desc, id').
          paginate(:page => page, :per_page => ENTRIES_PER_PAGE)
    end
  end

また、app/views/blog_entries/index.rhtml を次のように修正します。

<% if @blog_entry_pages.page_count > 1 -%>
<div class="pagination">
  <%= my_pagination_links @blog_entry_pages %>
</div>
<% end -%>
<%= will_paginate @blog_entries, :previous_label => '前へ', :next_label => '次へ', :inner_window => 2 %>

test/functional/blog_entries_test.rb の test_index1 メソッド

  # indexアクション
  def test_index1
    get :index
    assert_response :success
    
    assert_kind_of Array, assigns(:blog_entries)
    paginator = assigns(:blog_entry_pages)
    assert paginator.respond_to?(:current)
    assert_equal 20.quo(BlogEntriesController::ENTRIES_PER_PAGE).ceil,
      paginator.page_count
    
    assert_kind_of Array, assigns(:authors)
    assert assigns(:authors).all? {|a| a.blog and
                                 (a.blog.blog_entries.length > 0) }
    assert_equal 2, assigns(:authors).length
  end

を、次のように修正します。

  # indexアクション
  def test_index1
    get :index
    assert_response :success
    
    assert_kind_of Array, assigns(:blog_entries)
    
    assert_kind_of Array, assigns(:authors)
    assert assigns(:authors).all? {|a| a.blog and
                                 (a.blog.blog_entries.length > 0) }
    assert_equal 2, assigns(:authors).length
  end

同様に、test_index2 メソッド

  # indexアクション(:blog_idあり)
  def test_index2
    taro = members(:taro)
    
    get :index, { :blog_id => taro.blog.id }
    assert_response :success
    
    assert_kind_of Array, assigns(:blog_entries)
    assert assigns(:blog_entries).all? {|e|
                          e.blog.author.id == taro.id }
    paginator = assigns(:blog_entry_pages)
    assert paginator.respond_to?(:current)
    assert paginator.current.first?
    assert_equal 10.quo(BlogEntriesController::ENTRIES_PER_PAGE).ceil,
      paginator.page_count
  end

を、次のように修正します。

  # indexアクション(:blog_idあり)
  def test_index2
    taro = members(:taro)
    
    get :index, { :blog_id => taro.blog.id }
    assert_response :success
    
    assert_kind_of Array, assigns(:blog_entries)
    assert assigns(:blog_entries).all? {|e|
                          e.blog.author.id == taro.id }
  end

テストメソッド test_routing は、前回同様、URL のパターンが Rails 1.2.4 で変更されたことによるものです。

    assert_generates '/blog_entries/99;edit',
      { :controller => 'blog_entries', :action => 'edit', :id => 99 }

を、次のように修正してください。

    assert_generates '/blog_entries/99/edit',
      { :controller => 'blog_entries', :action => 'edit', :id => 99 }

(これも前回と同じですが)最後に、blog_entries_controller_test.rb の 2-4 行の余分なコード

require 'blog_entries_controller'

# Re-raise errors caught by the controller.
class BlogEntriesController; def rescue_action(e) raise e end; end

を削除して、警告が出ないようにしておきましょう。

test:functionals タスクを実行すると…

92 tests, 310 assertions, 2 failures, 4 errors

失敗の数が 3 から 2 に、エラーの数が 6 から 4 に減りました。終わりが見えてきましたね。

修正内容は前回とほぼ同じであったため読み物としてはまったく面白くありませんが、本日はここまで。