Railsテスティングガイド
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
&tag(Railsテスティングガイド);
*目次 [#b63ae818]
#contents
*関連ページ [#l728a547]
-[[Rails テスティングガイド | Rails ガイド:https://railsg...
-[[Testing Rails Applications — Ruby on Rails Guides:http...
*参考情報 [#z8d31c99]
* 1 Railsアプリケーションでテストを作成しなければならない...
* 2 テストを導入する [#xe4e9d82]
** 2.1 Rails Sets up for Testing from the Word Go [#j52f7...
-Railsプロジェクトを作成すると以下のようなフォルダが作成...
#pre{{
$ ls -F test
controllers/ helpers/ mailers/ ...
fixtures/ integration/ models/ ...
}}
** 2.2 The Test Environment [#v67cb360]
-testはtest環境で実施される。
-config/database.ymlでテスト用のデータベースが設定できる。
** 2.3 Rails meets Minitest [#ye73ffcd]
-モデルを生成するとテストが自動的に作成される。
#pre{{
$ bin/rails generate model article title:string body:text
...
create app/models/article.rb
create test/models/article_test.rb
create test/fixtures/articles.yml
...
}}
-test/models/article_test.rbは以下のような内容となる。
#pre{{
require 'test_helper'
class ArticleTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end
}}
-テストメソッド名は以下のどちらでもよい。
#pre{{
test "the truth" do
assert true
end
def test_the_truth
assert true
end
}}
-失敗テスト。articleのtitleが設定されていないので以下のテ...
#pre{{
test "should not save article without title" do
article = Article.new
assert_not article.save
end
}}
-実行。本来失敗してほしいのだが成功してしまう。
#pre{{
$ bin/rails test test/models/article_test.rb
}}
-articleに検証メソッドを追加すると成功する。
#pre{{
class Article < ApplicationRecord
validates :title, presence: true
end
}}
** 2.4 Available Assertions [#fbdc2b74]
**2.5 Rails Specific Assertions [#se6208f2]
**2.6 A Brief Note About Test Cases [#ib167b69]
**2.7 The Rails Test Runner [#seb79b61]
-bin/rails testコマンドで全てのテストを実行できる。
-特定のテストやメソッドを実行する場合。
#pre{{
$ bin/rails test test/models/article_test.rb
$ bin/rails test test/models/article_test.rb -n test_the_...
$ bin/rails test test/models/article_test.rb:6 #行番号の...
$ bin/rails test test/controllers #ディレクトリ
}}
*3 The Test Database [#a221eb97]
-テスト用のデータベースが使われる。
-config/database.ymlで定義。
**3.1 Maintaining the test database schema [#cbfed533]
-テストを実行するためには現在のデータがデータベースに反映...
-テストヘルパーは保留中のmigrationsが存在しないあかどうか...
**3.2 The Low-Down on Fixtures [#q1f10dde]
-Railsではフィクスチャと呼ばれる仕組みを利用してテストデ...
-test/fixturesディレクトリ以下に存在しYAMLで定義。
#pre{{
# lo & behold! I am a YAML comment!
david:
name: David Heinemeier Hansson
birthday: 1979-10-15
profession: Systems development
steve:
name: Steve Ross Kellock
birthday: 1974-09-27
profession: guy with keyboard
}}
-関連の定義。
#pre{{
# In fixtures/categories.yml
about:
name: About
# In fixtures/articles.yml
first:
title: Welcome to Rails!
body: Hello world!
category: about
}}
-fixturesのYAMLではERBを使用することもできる。
-テストの中で以下のように使用可能。
#pre{{
# this will return the User object for the fixture named ...
users(:david)
# this will return the property for david called id
users(:david).id
# one can also access methods available on the User class
david = users(:david)
david.call(david.partner)
}}
* 4 Model Testing [#u1bb93a0]
-モデルテストはモデルのテストを実行するもの。
-test/modelsディレクトリに作成する。
#pre{{
$ bin/rails generate test_unit:model article title:string...
create test/models/article_test.rb
create test/fixtures/articles.yml
}}
* 5 System Testing [#ubac64da]
-システムテストは、アプリケーションとシステムの相互作用を...
-リアルorヘッドレスブラウザを使用してテスト実行。
-Capybaraを利用する。
-railsではtest/systemディレクトリ以下に作成する。
#pre{{
$ bin/rails generate system_test users
}}
-以下の内容
#pre{{
require "application_system_test_case"
class UsersTest < ApplicationSystemTestCase
# test "visiting the index" do
# visit users_url
#
# assert_selector "h1", text: "Users"
# end
end
}}
-デフォルトでシステムテストはSeleniumドライバで実行される。
** 5.1 Changing the default settings [#e0f1f73e]
-railsのシステムテストの設定は簡単に変更できる。
-例えばSeleniumからPoltergeistに変更したい場合Gemfileにpo...
#pre{{
require "test_helper"
require "capybara/poltergeist"
class ApplicationSystemTestCase < ActionDispatch::SystemT...
driven_by :poltergeist
end
class ApplicationSystemTestCase < ActionDispatch::SystemT...
driven_by :selenium, using: :firefox
end
class ApplicationSystemTestCase < ActionDispatch::SystemT...
driven_by :selenium, using: :headless_chrome
end
}}
**5.2 Screenshot Helper [#x1e3cf99]
-ScreenshotHelperはスクリーンショットヘルパーを取得するの...
-take_screenshotとtake_failed_screenshotが存在。
**5.3 Implementing a system test [#u21cd85c]
-システムテストのスケルトンを生成する。
$ bin/rails generate system_test articles
-テストファイルの中身。
#pre{{
require "application_system_test_case"
class ArticlesTest < ApplicationSystemTestCase
test "viewing the index" do
visit articles_path
assert_selector "h1", text: "Articles"
end
end
}}
-テストの実行。デフォルトでrails testではシステムテストを...
bin/rails test:system
★chromedriverが存在しないと実行できない。macOSの場合「bre...
-新しい記事を作成するテスト。
#pre{{
test "creating an article" do
visit articles_path
click_on "New Article"
fill_in "Title", with: "Creating an Article"
fill_in "Body", with: "Created this article successfull...
click_on "Create Article"
assert_text "Creating an Article"
end
}}
-最初にarticles_pathに移動して、"New Article"ボタンをクリ...
-システムテストはユーザーが利用しているソフトをシステムを...
* 6 Integration Testing [#kb7fa84e]
-統合テストはアプリケーションのさまざまな箇所が相互作用す...
-アプケーション内の重要なワークフローをテストする。
-railsでは統合テストはtest/integrationディレクトリに作成...
-以下のように作成できる。
#pre{{
$ bin/rails generate integration_test user_flows
}}
-その中身。
#pre{{
require 'test_helper'
class UserFlowsTest < ActionDispatch::IntegrationTest
# test "the truth" do
# assert true
# end
end
}}
-テストはActionDispatch::IntegrationTestを警鐘する。
** 6.1 Helpers Available for Integration Tests [#r6b1a798]
-ActionDispatch::IntegrationTestでは標準のテストに加え追...
--ActionDispatch::Integration::Runner
--ActionDispatch::Integration::RequestHelpers
--ActionDispatch::Integration::Session
**6.2 Implementing an integration test [#a5bd52de]
-ブログシステムに統合テストを追加する。
$ bin/rails generate integration_test blog_flow
-BlogFlowTestを実装する。"/"を取得しh1タグの中身が"Welcom...
#pre{{
require 'test_helper'
class BlogFlowTest < ActionDispatch::IntegrationTest
test "can see the welcome page" do
get "/"
assert_select "h1", "Welcome#index"
end
end
}}
-welcome_controllerの作成。
bundle exec rails generate controller Welcome index
-routes.rbの設定。
#pre{{
Rails.application.routes.draw do
get 'welcome/index'
root 'welcome#index'
resources :articles
end
}}
-記事作成のテスト。
#pre{{
test "can create an article" do
get "/articles/new"
assert_response :success
post "/articles",
params: { article: { title: "can create", body: ...
assert_response :redirect
follow_redirect!
assert_response :success
assert_select "p", "Title:\n can create"
# assert_select "p" do |element|
# # 該当するNokogiri::XML::NodeSetがかえってくる(こ...
# # textでタグを除いた状態のテキストが取得できる。こ...
# p element.text
# end
end
}}
* 7 Functional Tests for Your Controllers [#fa363cc5]
-Railsではコントローラーの個別の(?)メソッドをテストするに...
**7.1 What to include in your Functional Tests [#sb6d18bf]
-以下の内容を機能テストに記述する
--リクエストが成功したか
--リダイレクトが正しいか。
--ユーザー認証が成功したか。
--正しいオブジェクトがtemplateに埋め込まれたか。
--適切なメッセージがビューに表示されたか。
-機能テストを作成するにはscaffoldを使用するのが簡単。test...
$ bin/rails generate scaffold_controller article title:s...
-すでにコントローラーを作成済みで、7つのデフォルトアクシ...
$ bin/rails generate test_unit:scaffold article
-テストの一つ。
#pre{{
# articles_controller_test.rb
class ArticlesControllerTest < ActionDispatch::Integratio...
test "should get index" do
get articles_url
assert_response :success
end
end
}}
-getメソッドwebリクエストを送信し、@responseで結果を受け...
--URI(例えばarticles_url)。
--params
--headers
--env
--xhr
--as
-showアクションでリファラを設定する場合。
#pre{{
get article_url, params: { id: 12 }, headers: { "HTTP_REF...
}}
-updateアクションをAjaxリクエストする場合。
#pre{{
patch article_url, params: { id: 12 }, xhr: true
}}
-記事作成メソッドのテスト(この前にテストを実行すると、新...
#pre{{
test "should create article" do
assert_difference('Article.count') do
post articles_url, params: { article: { body: 'Rails ...
end
assert_redirected_to article_path(Article.last)
end
}}
** 7.2 Available Request Types for Functional Tests [#zfe...
-以下のリクエストタイプが使用できる。
--get
--post
--patch
--put
--head
--delete
** 7.3 Testing XHR (AJAX) requests [#xcda9c3b]
-AJAXリクエストをテストするには、「xhr: true」オプション...
#pre{{
test "ajax request" do
article = articles(:one)
get article_url(article), xhr: true
assert_equal 'hello world', @response.body
assert_equal "text/javascript", @response.content_type
end
}}
** 7.4 The Three Hashes of the Apocalypse [#jc03b04f]
-requestが作成されて処理されると、以下の3種類のハッシュが...
--cookies
--flash
--session
-サンプル
#pre{{
flash["gordon"] flash[:gordon]
session["shmession"] session[:shmession]
cookies["are_good_for_u"] cookies[:are_good_for_u]
}}
**7.5 Instance Variables Available [#r37ce069]
-また以下のインスタンス変数にもアクセスできるようになる。
--@controller
--@request
--@@response
-サンプル
#pre{{
class ArticlesControllerTest < ActionDispatch::Integratio...
test "should get index" do
get articles_url
assert_equal "index", @controller.action_name
assert_equal "application/x-www-form-urlencoded", @re...
assert_match "Articles", @response.body
end
end
}}
** 7.6 Setting Headers and CGI variables [#pf1913ac]
-HTTPヘッダーとCGI変数をヘッダーとして設定できる。
#pre{{
# setting an HTTP Header
get articles_url, headers: { "Content-Type": "text/plain"...
# setting a CGI variable
get articles_url, headers: { "HTTP_REFERER": "http://exam...
}}
**7.7 Testing flash notices [#jb55e33a]
-flashのテスト。
-test_should_create_articleにassertionを追加する。
#pre{{
test "should create article" do
assert_difference('Article.count') do
post article_url, params: { article: { title: 'Some t...
end
assert_redirected_to article_path(Article.last)
assert_equal 'Article was successfully created.', flash...
end
}}
-テストを実行すると失敗する(が実際は成功した)。
-article.rbを変更する。
#pre{{
def create
@article = Article.new(article_params)
if @article.save
flash[:notice] = 'Article was successfully created.'
redirect_to @article
else
render 'new'
end
end
}}
** 7.8 Putting it together [#nf982660]
-その他のテスト。show
#pre{{
test "should show article" do
article = articles(:one)
get article_url(article)
assert_response :success
end
}}
-destroy
#pre{{
test "should destroy article" do
article = articles(:one)
assert_difference('Article.count', -1) do
delete article_url(article)
end
assert_redirected_to articles_path
end
}}
-update
#pre{{
test "should update article" do
article = articles(:one)
patch article_url(article), params: { article: { title:...
assert_redirected_to article_path(article)
# Reload association to fetch updated data and assert t...
article.reload
assert_equal "updated", article.title
end
}}
** 7.9 Test helpers [#g3fa1982]
-重複をさけるためヘルパーが存在。
#pre{{
module SignInHelper
def sign_in_as(user)
post sign_in_url(email: user.email, password: user.pa...
end
end
class ActionDispatch::IntegrationTest
include SignInHelper
end
require 'test_helper'
class ProfileControllerTest < ActionDispatch::Integration...
test "should show profile" do
# helper is now reusable from any controller test case
sign_in_as users(:david)
get profile_url
assert_response :success
end
end
}}
* 8 Testing Routes [#l8b5c86a]
-ルートのテストも可能。
-test/controllersなどでテストする。
*9 Testing Views [#j3cc3ffb]
-ビューに対するテストではassert_selectが使用できる。
-assert_select(selector, [equality], [message]) : selecto...
-assert_select(element, selector, [equality], [message]):...
-titleが文字列を含んでいることを確認する場合
assert_select 'title', "Welcome to Rails Testing Guide"
-nestさせることもできる
#pre{{
assert_select 'ul.navigation' do
assert_select 'li.menu_item'
end
}}
-選択された複数の要素は繰り返し呼び出すこともできる。
-例えば4つの要素を持つ二つの順序つきリストを処理する場合...
#pre{{
assert_select "ol" do |elements|
elements.each do |element|
assert_select element, "li", 4
end
end
assert_select "ol" do
assert_select "li", 8
end
}}
-https://github.com/rails/rails-dom-testing/blob/master/l...
*10 Testing Helpers [#y1c50370]
-ヘルパーはシンプルなモジュール。
-ヘルパーに関するtest/helpersディレクトリ以下に置く。
-以下のヘルパーが存在するとき
#pre{{
module UserHelper
def link_to_user(user)
link_to "#{user.first_name} #{user.last_name}", user
end
end
}}
-以下のテストを作成する
#pre{{
class UserHelperTest < ActionView::TestCase
test "should return the user's full name" do
user = users(:david)
assert_dom_equal %{<a href="/user/#{user.id}">David H...
end
}}
*11 Testing Your Mailers [#f2890d53]
**11.1 Keeping the Postman in Check [#tf2a2a3b]
-メーラーもテストする必要がある。
--メールが処理されるか
--メールの内容が正しいか
--正しいタイミングでメールが送信されたか。
-単体テストあるいは機能テストでテストできる。
**11.2 Unit Testing [#bc3ff60e]
-単体テストを使用してメールの結果を比較する。
-メーラーをテストするためにフィクスチャを利用する。UserMa...
-UserMailerのテスト
#pre{{
require 'test_helper'
class UserMailerTest < ActionMailer::TestCase
test "invite" do
# Create the email and store it for further assertions
email = UserMailer.create_invite('me@example.com',
'friend@example.com'...
# Send the email, then test that it got queued
assert_emails 1 do
email.deliver_now
end
# Test the body of the sent email contains what we ex...
assert_equal ['me@example.com'], email.from
assert_equal ['friend@example.com'], email.to
assert_equal 'You have been invited by me@example.com...
assert_equal read_fixture('invite').join, email.body....
end
end
}}
-メールを送信しその結果を検証している。
-inviteフィクスチャの中身。
#pre{{
Hi friend@example.com,
You have been invited.
Cheers!
}}
-config/environments/test.rbのActionMailer::Base.delivery...
**11.3 Functional Testing [#f1eb5c12]
-functional testでは配信のテストを行う。
#pre{{
require 'test_helper'
class UserControllerTest < ActionDispatch::IntegrationTest
test "invite friend" do
assert_difference 'ActionMailer::Base.deliveries.size...
post invite_friend_url, params: { email: 'friend@ex...
end
invite_email = ActionMailer::Base.deliveries.last
assert_equal "You have been invited by me@example.com...
assert_equal 'friend@example.com', invite_email.to[0]
assert_match(/Hi friend@example\.com/, invite_email.b...
end
end
}}
* 12 Testing Jobs [#c9a2d58f]
-ジョブのテストも行う必要がある。
**12.1 A Basic Test Case [#h01f20db]
-jobのテストはtest/job以下に作成される。
#pre{{
require 'test_helper'
class BillingJobTest < ActiveJob::TestCase
test 'that account is charged' do
BillingJob.perform_now(account, product)
assert account.reload.charged_for?(product)
end
end
}}
**12.2 Custom Assertions And Testing Jobs Inside Other Co...
-job用のカスタムアサーションが多数存在する。
#pre{{
require 'test_helper'
class ProductTest < ActiveJob::TestCase
test 'billing job scheduling' do
assert_enqueued_with(job: BillingJob) do
product.charge(account)
end
end
end
}}
*13 Additional Testing Resources [#o362bc7c]
**13.1 Testing Time-Dependent Code [#b9948801]
-時間に関連したためのテストを行うヘルパーメソッドも存在す...
-例えばtravel_to
#pre{{
# Lets say that a user is eligible for gifting a month af...
user = User.create(name: 'Gaurish', activation_date: Date...
assert_not user.applicable_for_gifting?
travel_to Date.new(2004, 11, 24) do
assert_equal Date.new(2004, 10, 24), user.activation_da...
assert user.applicable_for_gifting?
end
assert_equal Date.new(2004, 10, 24), user.activation_date...
}}
終了行:
&tag(Railsテスティングガイド);
*目次 [#b63ae818]
#contents
*関連ページ [#l728a547]
-[[Rails テスティングガイド | Rails ガイド:https://railsg...
-[[Testing Rails Applications — Ruby on Rails Guides:http...
*参考情報 [#z8d31c99]
* 1 Railsアプリケーションでテストを作成しなければならない...
* 2 テストを導入する [#xe4e9d82]
** 2.1 Rails Sets up for Testing from the Word Go [#j52f7...
-Railsプロジェクトを作成すると以下のようなフォルダが作成...
#pre{{
$ ls -F test
controllers/ helpers/ mailers/ ...
fixtures/ integration/ models/ ...
}}
** 2.2 The Test Environment [#v67cb360]
-testはtest環境で実施される。
-config/database.ymlでテスト用のデータベースが設定できる。
** 2.3 Rails meets Minitest [#ye73ffcd]
-モデルを生成するとテストが自動的に作成される。
#pre{{
$ bin/rails generate model article title:string body:text
...
create app/models/article.rb
create test/models/article_test.rb
create test/fixtures/articles.yml
...
}}
-test/models/article_test.rbは以下のような内容となる。
#pre{{
require 'test_helper'
class ArticleTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end
}}
-テストメソッド名は以下のどちらでもよい。
#pre{{
test "the truth" do
assert true
end
def test_the_truth
assert true
end
}}
-失敗テスト。articleのtitleが設定されていないので以下のテ...
#pre{{
test "should not save article without title" do
article = Article.new
assert_not article.save
end
}}
-実行。本来失敗してほしいのだが成功してしまう。
#pre{{
$ bin/rails test test/models/article_test.rb
}}
-articleに検証メソッドを追加すると成功する。
#pre{{
class Article < ApplicationRecord
validates :title, presence: true
end
}}
** 2.4 Available Assertions [#fbdc2b74]
**2.5 Rails Specific Assertions [#se6208f2]
**2.6 A Brief Note About Test Cases [#ib167b69]
**2.7 The Rails Test Runner [#seb79b61]
-bin/rails testコマンドで全てのテストを実行できる。
-特定のテストやメソッドを実行する場合。
#pre{{
$ bin/rails test test/models/article_test.rb
$ bin/rails test test/models/article_test.rb -n test_the_...
$ bin/rails test test/models/article_test.rb:6 #行番号の...
$ bin/rails test test/controllers #ディレクトリ
}}
*3 The Test Database [#a221eb97]
-テスト用のデータベースが使われる。
-config/database.ymlで定義。
**3.1 Maintaining the test database schema [#cbfed533]
-テストを実行するためには現在のデータがデータベースに反映...
-テストヘルパーは保留中のmigrationsが存在しないあかどうか...
**3.2 The Low-Down on Fixtures [#q1f10dde]
-Railsではフィクスチャと呼ばれる仕組みを利用してテストデ...
-test/fixturesディレクトリ以下に存在しYAMLで定義。
#pre{{
# lo & behold! I am a YAML comment!
david:
name: David Heinemeier Hansson
birthday: 1979-10-15
profession: Systems development
steve:
name: Steve Ross Kellock
birthday: 1974-09-27
profession: guy with keyboard
}}
-関連の定義。
#pre{{
# In fixtures/categories.yml
about:
name: About
# In fixtures/articles.yml
first:
title: Welcome to Rails!
body: Hello world!
category: about
}}
-fixturesのYAMLではERBを使用することもできる。
-テストの中で以下のように使用可能。
#pre{{
# this will return the User object for the fixture named ...
users(:david)
# this will return the property for david called id
users(:david).id
# one can also access methods available on the User class
david = users(:david)
david.call(david.partner)
}}
* 4 Model Testing [#u1bb93a0]
-モデルテストはモデルのテストを実行するもの。
-test/modelsディレクトリに作成する。
#pre{{
$ bin/rails generate test_unit:model article title:string...
create test/models/article_test.rb
create test/fixtures/articles.yml
}}
* 5 System Testing [#ubac64da]
-システムテストは、アプリケーションとシステムの相互作用を...
-リアルorヘッドレスブラウザを使用してテスト実行。
-Capybaraを利用する。
-railsではtest/systemディレクトリ以下に作成する。
#pre{{
$ bin/rails generate system_test users
}}
-以下の内容
#pre{{
require "application_system_test_case"
class UsersTest < ApplicationSystemTestCase
# test "visiting the index" do
# visit users_url
#
# assert_selector "h1", text: "Users"
# end
end
}}
-デフォルトでシステムテストはSeleniumドライバで実行される。
** 5.1 Changing the default settings [#e0f1f73e]
-railsのシステムテストの設定は簡単に変更できる。
-例えばSeleniumからPoltergeistに変更したい場合Gemfileにpo...
#pre{{
require "test_helper"
require "capybara/poltergeist"
class ApplicationSystemTestCase < ActionDispatch::SystemT...
driven_by :poltergeist
end
class ApplicationSystemTestCase < ActionDispatch::SystemT...
driven_by :selenium, using: :firefox
end
class ApplicationSystemTestCase < ActionDispatch::SystemT...
driven_by :selenium, using: :headless_chrome
end
}}
**5.2 Screenshot Helper [#x1e3cf99]
-ScreenshotHelperはスクリーンショットヘルパーを取得するの...
-take_screenshotとtake_failed_screenshotが存在。
**5.3 Implementing a system test [#u21cd85c]
-システムテストのスケルトンを生成する。
$ bin/rails generate system_test articles
-テストファイルの中身。
#pre{{
require "application_system_test_case"
class ArticlesTest < ApplicationSystemTestCase
test "viewing the index" do
visit articles_path
assert_selector "h1", text: "Articles"
end
end
}}
-テストの実行。デフォルトでrails testではシステムテストを...
bin/rails test:system
★chromedriverが存在しないと実行できない。macOSの場合「bre...
-新しい記事を作成するテスト。
#pre{{
test "creating an article" do
visit articles_path
click_on "New Article"
fill_in "Title", with: "Creating an Article"
fill_in "Body", with: "Created this article successfull...
click_on "Create Article"
assert_text "Creating an Article"
end
}}
-最初にarticles_pathに移動して、"New Article"ボタンをクリ...
-システムテストはユーザーが利用しているソフトをシステムを...
* 6 Integration Testing [#kb7fa84e]
-統合テストはアプリケーションのさまざまな箇所が相互作用す...
-アプケーション内の重要なワークフローをテストする。
-railsでは統合テストはtest/integrationディレクトリに作成...
-以下のように作成できる。
#pre{{
$ bin/rails generate integration_test user_flows
}}
-その中身。
#pre{{
require 'test_helper'
class UserFlowsTest < ActionDispatch::IntegrationTest
# test "the truth" do
# assert true
# end
end
}}
-テストはActionDispatch::IntegrationTestを警鐘する。
** 6.1 Helpers Available for Integration Tests [#r6b1a798]
-ActionDispatch::IntegrationTestでは標準のテストに加え追...
--ActionDispatch::Integration::Runner
--ActionDispatch::Integration::RequestHelpers
--ActionDispatch::Integration::Session
**6.2 Implementing an integration test [#a5bd52de]
-ブログシステムに統合テストを追加する。
$ bin/rails generate integration_test blog_flow
-BlogFlowTestを実装する。"/"を取得しh1タグの中身が"Welcom...
#pre{{
require 'test_helper'
class BlogFlowTest < ActionDispatch::IntegrationTest
test "can see the welcome page" do
get "/"
assert_select "h1", "Welcome#index"
end
end
}}
-welcome_controllerの作成。
bundle exec rails generate controller Welcome index
-routes.rbの設定。
#pre{{
Rails.application.routes.draw do
get 'welcome/index'
root 'welcome#index'
resources :articles
end
}}
-記事作成のテスト。
#pre{{
test "can create an article" do
get "/articles/new"
assert_response :success
post "/articles",
params: { article: { title: "can create", body: ...
assert_response :redirect
follow_redirect!
assert_response :success
assert_select "p", "Title:\n can create"
# assert_select "p" do |element|
# # 該当するNokogiri::XML::NodeSetがかえってくる(こ...
# # textでタグを除いた状態のテキストが取得できる。こ...
# p element.text
# end
end
}}
* 7 Functional Tests for Your Controllers [#fa363cc5]
-Railsではコントローラーの個別の(?)メソッドをテストするに...
**7.1 What to include in your Functional Tests [#sb6d18bf]
-以下の内容を機能テストに記述する
--リクエストが成功したか
--リダイレクトが正しいか。
--ユーザー認証が成功したか。
--正しいオブジェクトがtemplateに埋め込まれたか。
--適切なメッセージがビューに表示されたか。
-機能テストを作成するにはscaffoldを使用するのが簡単。test...
$ bin/rails generate scaffold_controller article title:s...
-すでにコントローラーを作成済みで、7つのデフォルトアクシ...
$ bin/rails generate test_unit:scaffold article
-テストの一つ。
#pre{{
# articles_controller_test.rb
class ArticlesControllerTest < ActionDispatch::Integratio...
test "should get index" do
get articles_url
assert_response :success
end
end
}}
-getメソッドwebリクエストを送信し、@responseで結果を受け...
--URI(例えばarticles_url)。
--params
--headers
--env
--xhr
--as
-showアクションでリファラを設定する場合。
#pre{{
get article_url, params: { id: 12 }, headers: { "HTTP_REF...
}}
-updateアクションをAjaxリクエストする場合。
#pre{{
patch article_url, params: { id: 12 }, xhr: true
}}
-記事作成メソッドのテスト(この前にテストを実行すると、新...
#pre{{
test "should create article" do
assert_difference('Article.count') do
post articles_url, params: { article: { body: 'Rails ...
end
assert_redirected_to article_path(Article.last)
end
}}
** 7.2 Available Request Types for Functional Tests [#zfe...
-以下のリクエストタイプが使用できる。
--get
--post
--patch
--put
--head
--delete
** 7.3 Testing XHR (AJAX) requests [#xcda9c3b]
-AJAXリクエストをテストするには、「xhr: true」オプション...
#pre{{
test "ajax request" do
article = articles(:one)
get article_url(article), xhr: true
assert_equal 'hello world', @response.body
assert_equal "text/javascript", @response.content_type
end
}}
** 7.4 The Three Hashes of the Apocalypse [#jc03b04f]
-requestが作成されて処理されると、以下の3種類のハッシュが...
--cookies
--flash
--session
-サンプル
#pre{{
flash["gordon"] flash[:gordon]
session["shmession"] session[:shmession]
cookies["are_good_for_u"] cookies[:are_good_for_u]
}}
**7.5 Instance Variables Available [#r37ce069]
-また以下のインスタンス変数にもアクセスできるようになる。
--@controller
--@request
--@@response
-サンプル
#pre{{
class ArticlesControllerTest < ActionDispatch::Integratio...
test "should get index" do
get articles_url
assert_equal "index", @controller.action_name
assert_equal "application/x-www-form-urlencoded", @re...
assert_match "Articles", @response.body
end
end
}}
** 7.6 Setting Headers and CGI variables [#pf1913ac]
-HTTPヘッダーとCGI変数をヘッダーとして設定できる。
#pre{{
# setting an HTTP Header
get articles_url, headers: { "Content-Type": "text/plain"...
# setting a CGI variable
get articles_url, headers: { "HTTP_REFERER": "http://exam...
}}
**7.7 Testing flash notices [#jb55e33a]
-flashのテスト。
-test_should_create_articleにassertionを追加する。
#pre{{
test "should create article" do
assert_difference('Article.count') do
post article_url, params: { article: { title: 'Some t...
end
assert_redirected_to article_path(Article.last)
assert_equal 'Article was successfully created.', flash...
end
}}
-テストを実行すると失敗する(が実際は成功した)。
-article.rbを変更する。
#pre{{
def create
@article = Article.new(article_params)
if @article.save
flash[:notice] = 'Article was successfully created.'
redirect_to @article
else
render 'new'
end
end
}}
** 7.8 Putting it together [#nf982660]
-その他のテスト。show
#pre{{
test "should show article" do
article = articles(:one)
get article_url(article)
assert_response :success
end
}}
-destroy
#pre{{
test "should destroy article" do
article = articles(:one)
assert_difference('Article.count', -1) do
delete article_url(article)
end
assert_redirected_to articles_path
end
}}
-update
#pre{{
test "should update article" do
article = articles(:one)
patch article_url(article), params: { article: { title:...
assert_redirected_to article_path(article)
# Reload association to fetch updated data and assert t...
article.reload
assert_equal "updated", article.title
end
}}
** 7.9 Test helpers [#g3fa1982]
-重複をさけるためヘルパーが存在。
#pre{{
module SignInHelper
def sign_in_as(user)
post sign_in_url(email: user.email, password: user.pa...
end
end
class ActionDispatch::IntegrationTest
include SignInHelper
end
require 'test_helper'
class ProfileControllerTest < ActionDispatch::Integration...
test "should show profile" do
# helper is now reusable from any controller test case
sign_in_as users(:david)
get profile_url
assert_response :success
end
end
}}
* 8 Testing Routes [#l8b5c86a]
-ルートのテストも可能。
-test/controllersなどでテストする。
*9 Testing Views [#j3cc3ffb]
-ビューに対するテストではassert_selectが使用できる。
-assert_select(selector, [equality], [message]) : selecto...
-assert_select(element, selector, [equality], [message]):...
-titleが文字列を含んでいることを確認する場合
assert_select 'title', "Welcome to Rails Testing Guide"
-nestさせることもできる
#pre{{
assert_select 'ul.navigation' do
assert_select 'li.menu_item'
end
}}
-選択された複数の要素は繰り返し呼び出すこともできる。
-例えば4つの要素を持つ二つの順序つきリストを処理する場合...
#pre{{
assert_select "ol" do |elements|
elements.each do |element|
assert_select element, "li", 4
end
end
assert_select "ol" do
assert_select "li", 8
end
}}
-https://github.com/rails/rails-dom-testing/blob/master/l...
*10 Testing Helpers [#y1c50370]
-ヘルパーはシンプルなモジュール。
-ヘルパーに関するtest/helpersディレクトリ以下に置く。
-以下のヘルパーが存在するとき
#pre{{
module UserHelper
def link_to_user(user)
link_to "#{user.first_name} #{user.last_name}", user
end
end
}}
-以下のテストを作成する
#pre{{
class UserHelperTest < ActionView::TestCase
test "should return the user's full name" do
user = users(:david)
assert_dom_equal %{<a href="/user/#{user.id}">David H...
end
}}
*11 Testing Your Mailers [#f2890d53]
**11.1 Keeping the Postman in Check [#tf2a2a3b]
-メーラーもテストする必要がある。
--メールが処理されるか
--メールの内容が正しいか
--正しいタイミングでメールが送信されたか。
-単体テストあるいは機能テストでテストできる。
**11.2 Unit Testing [#bc3ff60e]
-単体テストを使用してメールの結果を比較する。
-メーラーをテストするためにフィクスチャを利用する。UserMa...
-UserMailerのテスト
#pre{{
require 'test_helper'
class UserMailerTest < ActionMailer::TestCase
test "invite" do
# Create the email and store it for further assertions
email = UserMailer.create_invite('me@example.com',
'friend@example.com'...
# Send the email, then test that it got queued
assert_emails 1 do
email.deliver_now
end
# Test the body of the sent email contains what we ex...
assert_equal ['me@example.com'], email.from
assert_equal ['friend@example.com'], email.to
assert_equal 'You have been invited by me@example.com...
assert_equal read_fixture('invite').join, email.body....
end
end
}}
-メールを送信しその結果を検証している。
-inviteフィクスチャの中身。
#pre{{
Hi friend@example.com,
You have been invited.
Cheers!
}}
-config/environments/test.rbのActionMailer::Base.delivery...
**11.3 Functional Testing [#f1eb5c12]
-functional testでは配信のテストを行う。
#pre{{
require 'test_helper'
class UserControllerTest < ActionDispatch::IntegrationTest
test "invite friend" do
assert_difference 'ActionMailer::Base.deliveries.size...
post invite_friend_url, params: { email: 'friend@ex...
end
invite_email = ActionMailer::Base.deliveries.last
assert_equal "You have been invited by me@example.com...
assert_equal 'friend@example.com', invite_email.to[0]
assert_match(/Hi friend@example\.com/, invite_email.b...
end
end
}}
* 12 Testing Jobs [#c9a2d58f]
-ジョブのテストも行う必要がある。
**12.1 A Basic Test Case [#h01f20db]
-jobのテストはtest/job以下に作成される。
#pre{{
require 'test_helper'
class BillingJobTest < ActiveJob::TestCase
test 'that account is charged' do
BillingJob.perform_now(account, product)
assert account.reload.charged_for?(product)
end
end
}}
**12.2 Custom Assertions And Testing Jobs Inside Other Co...
-job用のカスタムアサーションが多数存在する。
#pre{{
require 'test_helper'
class ProductTest < ActiveJob::TestCase
test 'billing job scheduling' do
assert_enqueued_with(job: BillingJob) do
product.charge(account)
end
end
end
}}
*13 Additional Testing Resources [#o362bc7c]
**13.1 Testing Time-Dependent Code [#b9948801]
-時間に関連したためのテストを行うヘルパーメソッドも存在す...
-例えばtravel_to
#pre{{
# Lets say that a user is eligible for gifting a month af...
user = User.create(name: 'Gaurish', activation_date: Date...
assert_not user.applicable_for_gifting?
travel_to Date.new(2004, 11, 24) do
assert_equal Date.new(2004, 10, 24), user.activation_da...
assert user.applicable_for_gifting?
end
assert_equal Date.new(2004, 10, 24), user.activation_date...
}}
ページ名: