この投稿は別サイトからのクロス投稿です(クロス元:https://rikka-rt.hatenablog.jp/e...

少し間が開いてしまいましたが、今回から3章に入ります。

Railsプロジェクト作成

準備ができたら、いつも通りプロジェクトの作成を行います。

# cd /var/www  
# rails _5.1.6_ new sample_app

(前回と同じ結果になってしまったので)Gemfileを修正して。

source 'https://rubygems.org'  

git_source(:github) do |repo_name|  
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")  
  "https://github.com/#{repo_name}.git"  
end  

gem 'rails', '5.1.6'  
gem 'puma', '3.9.1'  
gem 'sass-rails', '5.0.6'  
gem 'uglifier', '3.2.0'  

gem 'coffee-rails', '4.2.2'  
gem 'jquery-rails', '4.3.1'  
gem 'turbolinks', '5.0.1'  
gem 'jbuilder', '2.7.0'  

group :development, :test do  
  gem 'sqlite3', '1.3.13'  
  gem 'byebug',  '9.0.6', platform: :mri  
  gem 'capybara', '~> 2.13'  
  gem 'selenium-webdriver'  
end  

group :development do  
  gem 'web-console', '3.5.1'  
  gem 'listen', '3.1.5'  
  gem 'spring', '2.0.2'  
  gem 'spring-watcher-listen', '2.0.1'  
end  

group :test do  
  gem 'rails-controller-testing', '1.0.2'  
  gem 'minitest', '5.10.3'  
  gem 'minitest-reporters', '1.1.14'  
  gem 'guard', '2.13.0'  
  gem 'guard-minitest', '2.4.4'  
end  

# bundle install --without production しているにもかかわらず、rails g すると Could not find pg~ になる。  
# Herokuを使わない場合は影響がないのでコメントアウトする。  
# group :production do  
#  gem 'pg', '0.20.0'  
# end  

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

gemをインストールする……が、またエラーが出ました。

# cd /var/www/sample_app  
# bundle install --without production  
You have requested:  
  minitest = 5.10.3  

The bundle currently has minitest locked at 5.11.3.  
Try running `bundle update minitest`  

If you are updating multiple gems in your Gemfile at once,  
try passing them all to `bundle update`

バージョン関係のエラーのようですが、とりあえず bundle update で全部まとめて更新してからinstallします。

# bundle update  
# bundle install --without production

静的ページ作成

準備ができたので、静的ページの作成に入っていきます。
まずは、コントローラーの生成、サーバー起動、画面結果表示の順に確認していきます。

# rails generate controller StaticPages home help  
# rails s

この辺は前回までと似ているため、大きな問題はなさそうですね。
HomeページとHelpページの修正は個別にやっておきましょう。

テスト駆動開発の実施

最近の開発では当たり前のように行われているUnitTestです。
まぁ、仕事ではお目にかかったことがないですけどね……(SES系での使用率が未だに少ないのか、それとも技術レベルがアレなのか……

テストファイルの中身は rails generate で作られているみたいなので、さっそく実行して確かめます。

# rails test  
Running via Spring preloader in process 51  
/var/www/sample_app/db/schema.rb does not exist yet. Run `rails db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /var/www/sample_app/config/application.rb to limit the frameworks that will be loaded.  
Run options: --seed 30724  

# Running:  

..  

Finished in 1.155474s, 1.7309 runs/s, 1.7309 assertions/s.  

2 runs, 2 assertions, 0 failures, 0 errors, 0 skips

db周りで色々と言われていますが、2 assertions なので無事に成功していますね。
次に、失敗するテストを static_pages_controller_test.rb に追記します。

require 'test_helper'  

class StaticPagesControllerTest < ActionDispatch::IntegrationTest  
  test "should get home" do  
    get static_pages_home_url  
    assert_response :success  
  end  

  test "should get help" do  
    get static_pages_help_url  
    assert_response :success  
  end  

  # 追記ここから  
  test "should get about" do  
    get static_pages_about_url  
    assert_response :success  
  end  
  # ここまで  
end

追記が終わったら、再びテストを実施。

# rails test  

# 前半省略  
# Running:  

E..  

Finished in 0.601228s, 4.9898 runs/s, 3.3265 assertions/s.  

  1) Error:  
StaticPagesControllerTest#test_should_get_about:  
NameError: undefined local variable or method `static_pages_about_url' for #<StaticPagesControllerTest:0x00007f68600910d0>  
    test/controllers/static_pages_controller_test.rb:15:in `block in <class:StaticPagesControllerTest>'  

3 runs, 2 assertions, 0 failures, 1 errors, 0 skips

無事にメソッド未定義エラーになりました。続けて、テストを通すための修正を routes.rb に行っていきます。

Rails.application.routes.draw do  
  get 'static_pages/home'  

  get 'static_pages/help'  

  # 追記ここから  
  get 'static_pages/about'  
  # ここまで  

  root 'application#hello'  
end

再度テストを実行。

# rails test  

# 前半省略  
# Running:  

.E.  

Finished in 0.691064s, 4.3411 runs/s, 2.8941 assertions/s.  

  1) Error:  
StaticPagesControllerTest#test_should_get_about:  
AbstractController::ActionNotFound: The action 'about' could not be found for StaticPagesController  
    test/controllers/static_pages_controller_test.rb:15:in `block in <class:StaticPagesControllerTest>'  

3 runs, 2 assertions, 0 failures, 1 errors, 0 skips

コントローラーにアクションがないっていうエラーになりました。更に続けて、static_pages_controller.rb を修正していきます。

class StaticPagesController < ApplicationController  
  def home  
  end  

  def help  
  end  

  # 追記ここから  
  def about  
  end  
  # ここまで  
end

またまたテストを実行。

# rails test  

# 前半省略  
# Running:  

E..  

Finished in 1.042990s, 2.8763 runs/s, 1.9176 assertions/s.  

  1) Error:  
StaticPagesControllerTest#test_should_get_about:  
ActionController::UnknownFormat: StaticPagesController#about is missing a template for this request format and variant.  

request.formats: ["text/html"]  
request.variant: []  

NOTE! For XHR/Ajax or API requests, this action would normally respond with 204 No Content: an empty white screen. Since you're loading it in a web browser, we assume that you expected to actually render a template, not nothing, so we're showing an error to be extra-clear. If you expect 204 No Content, carry on. That's what you'll get from an XHR or API request. Give it a shot.  
    test/controllers/static_pages_controller_test.rb:15:in `block in <class:StaticPagesControllerTest>'  

3 runs, 2 assertions, 0 failures, 1 errors, 0 skips

チュートリアル通りにテンプレートなしエラーになりましたので、最後にファイルを作ります。

最後のテスト実行。


# 前半省略  
# Running:  

...  

Finished in 0.581780s, 5.1566 runs/s, 5.1566 assertions/s.  

3 runs, 3 assertions, 0 failures, 0 errors, 0 skips

無事にテスト完了ですね。長くなりましたが、今回はここまでです。

関連記事

この記事へのコメント

まだコメントはありません
2
アイマスP兼エンジニアの雑記。
2
このエントリーをはてなブックマークに追加