この RSpec には 
夢があるッ!! 
inspire the るびま&ジョジョ 
今さらながら 
RSpecに入門してみた
さくらば@ZARU 
株式会社ベーシック&株式会社フルセイル 
TwitterとQiita、やってます。 
楽しいことは誰にも譲らないで、自分で楽しむタイプです。 
! カレーと寿司とラーメンが好き 
! プログラミングが好き 
! どんな言語も好きだけど、JavaScriptが大好き 
! 娘、産まれて育ってます
今さらながらRSpecに入門してみた
今日は 
Railsアプリで、RSpec使った 
テストに入門した話をします。
その前に…
宣伝!
今月もQiita投稿大会やってます! 
ルール 
! 月内に獲得したストック数が一番多いものが優勝 
! 月内に投稿された記事で咲いたストック数は優秀賞 
! 9月は優勝/優秀賞には天ぷら 
! さくらばが優勝したら、割り勘ね…
今さらながらRSpecに入門してみた
宣伝ここまで
はじめます
? 
そもそもテストって何?
…っていう話は今回はしません。
まず、テストコードを 
書けるようになってから考えよう。 
道具について語るには、まず道具を知ることから。
TDD is dead. Long live testing. 
Rails作者:David Heinemeier Hansson
今さらながらRSpecに入門してみた
偏った原理主義に走るなよ、環境は変わってきているんだし 
テストのあり方も変えていこうぜ。っていう話…と思ってます。
「磯野ー!テストしようぜ!」
テストの原則 
! テストは信頼できるものであること 
! テストは簡単に書けること 
! テストは簡単に理解できること 
RSpecによるRailsテスト入門より引用
前置きは終了。
この本を 
ベースに 
話します。 
分かりやすく 
とてもいい本です。 
RSpec3用にリニューアルも 
予定しているっぽいです。 
買いましょう。
RSpecに 
入門してみる
今日、話すこと 
! Gemfile + RSpec設定 
! モデルスペック 
! ファクトリ 
! コントローラスペック
Gemfile
group :development, :test do 
gem "rspec-rails", "~> 2.14.0" 
gem "factory_girl_rails", "~> 4.2.1" 
end 
group :test do 
gem "faker", "~> 1.1.2" 
gem "capybara", "~> 2.1.0" 
gem "database_cleaner", "~> 1.0.1" 
gem "launchy", "~> 2.3.0" 
gem "selenium-webdriver", "~> 2.39.0" 
end 
RSpec3が2014年6月くらいにリリースされているけど、今回は2系を使用。 
3については下記ページ参照。 
http://qiita.com/yujinakayama/items/a1d31b2caa35642e8e69 
http://nilp.hatenablog.com/entry/2014/05/28/003335
紹介
rspec-rails 
RSpec本体 + RailsでRSpec使うためのもろもろ。 
factory_girl_rails 
標準フィクスチャをもっと便利なファクトリとして提供してくれる。 
テストデータをさくっと作るのにイケてるガール。 
faker 
名前・メールアドレスなどダミーデータを作ってくれる。 
日本名に対応したFaker::Japaneseというのもある。 
capybara 
Webアプリテストをコードレベルで行うことができる。 
色々連携する。
database_cleaner 
まっさらな環境で、テストが実行できるように 
テストデータを消してくれる。 
launchy 
好きなタイミングでブラウザを開くことができる。 
selenium-webdriver 
Seleniumでブラウザ上テストを実行できる。 
他にもGuard・RuboCopとかテスト周りで便利なGemある
RSpecの設定
$ bundle exec rails g rspec:install 
create .rspec 
create spec 
create spec/spec_helper.rb 
.rspec 
--color 
--format documentation 
RSpecの実行結果を、見やすく楽しくしてくれる設定
こんな感じ
/config/application.rb 
config.generators do |g| 
g.test_framework :rspec, 
fixtures: true, 
view_specs: false, 
helper_specs: false, 
routing_specs: false, 
controller_specs: true, 
request_specs: false 
g.fixture_replacement :factory_girl, dir: "spec/factories” 
end 
ジェネレータで作成されるスペックファイルの設定。 
ビューはRSpecではテストしないので作らない。 
フィクスチャの代わりにファクトリを使う。
モデル 
スペック
名前とメールアドレスを持つContactという 
モデルがあったとして、Contactモデルの 
スペックを書いてみる。 
Contact 
name 
email 
さくっと、scaffoldしておく。 
$ bundle exec rails g  
scaffold contact  
name:string  
email:string:unique 
$ bundle exec rake db:migrate 
Rails4.1からdb:test:cloneなどは、自動で行われるので必要なくなった
テストって 
どう書くの?
モデルスペックを書いてみる
$vi /spec/models/contact_spec.rb 
require 'spec_helper' 
describe Contact do 
it "全てのデータが有効な状態であること" 
it "名前がなければ無効な状態であること" 
it "メールがなければ無効な状態であること" 
it "重複したメールアドレスなら無効な状態であること" 
end 
まず、期待する動作をアウトライン的に 
書き出してみる。
おもむろにテストを実行してみる。 
$ bundle exec rspec
scaffoldで勝手に作られた 
コントローラースペックが動いてます。 
+今作ったContactモデルのも。 
当然、テストの中身を書いてないので、 
pendingという状態になってます。
テストコードを書いてみる
require 'spec_helper' 
describe Contact do 
it "全てのデータが有効な状態であること" do 
contact = Contact.new( 
name: 'zaru', 
email: 'zaru@example.com' 
) 
expect(contact).to be_valid 
end 
end 
Contactモデルを作成する(DBには保存しない) 
expect(オブジェクト).to 期待するもの、でテストできる 
RSpec2.11から、オブジェクト.should が expect() に変更になりました
おもむろにテストを実行してみる。 
$ bundle exec rspec
テスト通ってる!
でも、実はこれ…
中身ないContactオブジェクト 
でもテスト通る!
require 'spec_helper' 
describe Contact do 
it "全てのデータが有効な状態であること" do 
contact = Contact.new() 
expect(contact).to be_valid 
end 
end 
通る!
なので、バリデーション設定しましょう。
$vi /app/models/contact.rb 
class Contact < ActiveRecord::Base 
validates :name, presence: true 
validates :email, presence: true, uniqueness: true 
end 
nameもemailも必須で、emailはユニーク扱い。
中身のないContactオブジェクトのまま… 
再度、実行!
失敗してる!
1個ずつバリデーションのテストしましょう
require 'spec_helper' 
describe Contact do 
it "名前がなければ無効な状態であること" do 
contact = Contact.new( 
name: nil 
) 
expect(contact).to have(1).errors_on(:name) 
end 
it "メールがなければ無効な状態であること" do 
contact = Contact.new( 
email: nil 
) 
expect(contact).to have(1).errors_on(:email) 
end 
end 
nameのデータを空にして 
エラーがでるかテスト
今さらながらRSpecに入門してみた
重複のテストもしましょう
require 'spec_helper' 
describe Contact do 
it "重複したメールアドレスなら無効な状態であること" do 
Contact.create( 
name: 'zaru', 
email: 'zaru@example.com' 
) 
contact = Contact.new( 
name: 'tofu', 
email: 'zaru@example.com' 
) 
expect(contact).to have(1).errors_on(:email) 
end 
end 
createは、テストデータを 
DBに登録をしてくれる。
CPC設定完了 
ニューラルリンケージ 
イオン濃度正常 
メタ運動野パラメータ更新 
原子炉臨界 
パワーフロー正常 
全システムオールグリーン 
ストライクフリーダム、システム起動
テストコードの書き方ポイント
! スペックはアウトラインと考える 
! describeでまとめて、itで期待する結果を書く 
contextは、状態の変化で使い分ける 
! itには1個につき、結果を1つだけ期待する 
! itは、◯◯である/◯◯すること、などの動詞にする 
! 起きてほしいことと、起きてほしくないことを書く 
! 境界値テストをすること 
◯文字以上~◯文字以内の場合、その前後の値で
ついでに、 
インスタンスメソッドをテストしてみる
名前付きメールアドレスを返すメソッド 
class Contact < ActiveRecord::Base 
def nameAddr 
"%s<%s>" % [name, email] 
end 
end
require 'spec_helper' 
describe Contact do 
it "名前付きメールアドレスを返すこと" do 
contact = Contact.new( 
name: 'zaru', 
email: 'zaru@example.com' 
) 
expect(contact.nameAddr).to 
eq 'zaru<zaru@example.com>' 
end 
end 
nameAddrを実行して、かえってくる文字列を比較する
テストコードをDRYに
beforeフックで、まとめる 
require 'spec_helper' 
describe Contact do 
before :each do 
@contact = Contact.new( 
name: 'zaru', 
email: 'zaru@example.com' 
) 
end 
end 
Contactオブジェクトをインスタンス変数に格納 
beforeは、describe中の各テストの前に実行される
ファクトリ
Factory 
Girl 
ひな形から 
テストデータを 
量産できる可愛い子
Contactファクトリ作る
$vi /spec/factories/contacts.rb 
FactoryGirl.define do 
factory :contact do 
name "zaru" 
sequence(:email) { |n| "zaru#{n}@example.com" } 
end 
end 
内部でインクリメンタルして、 
違うメールアドレスを作ってくれる
テストコードを書きなおしてみる
it "全てのデータが有効な状態であること" do 
contact = Contact.new( 
name: 'zaru', 
email: 'zaru@example.com' 
) 
expect(contact).to be_valid 
end 
it "全てのデータが有効な状態であること" do 
expect(FactoryGirl.build(:contact)).to be_valid 
end 
こうなる 
FactoryGirl.buildで、Contact.newと同様のことができる。 
FactoryGirl.createで、Contact.createと同じ。
FactoryGirlって 
打つの面倒
省略できます
$vi /spec/spec_helper.rb 
RSpec.configure do |config| 
config.include FactoryGirl::Syntax::Methods 
end 
it "全てのデータが有効な状態であること" do 
expect(build(:contact)).to be_valid 
end 
FactoryGirl省略できる
はい…
今日はここまで!
サンプルコードはGitHubにあります。 
https://github.com/zaru/rials_rspec_sample
次回
! コントローラースペック 
! Capybaraさん 
! REST WebAPIテスト
予定は 
未定…
$ shutdown -h now

More Related Content

PPTX
PPTX
Seminario confección de estructuras plurales sobre pilares ucla
PPTX
正規表現勉強会
PPTX
初心者のためのキャラクターの描き方のコツ 入門編
PDF
アプリのテストを書かなければならないと分かっているけども、書けていない人たちへ
PPTX
WEBページを表示するまで
PPTX
少し未来のコードレビュー
PPTX
エンジニアでもできる⁉︎それっぽいデザイン
Seminario confección de estructuras plurales sobre pilares ucla
正規表現勉強会
初心者のためのキャラクターの描き方のコツ 入門編
アプリのテストを書かなければならないと分かっているけども、書けていない人たちへ
WEBページを表示するまで
少し未来のコードレビュー
エンジニアでもできる⁉︎それっぽいデザイン

Viewers also liked (17)

PPTX
スマホフロントエンド最速化手法
PPTX
ワクワク電子工作
PDF
非エンジニア向けHTML勉強会その1
PDF
アプリデザインのお勉強 UI/UXのお話
PDF
ほんわかSwift勉強資料
PDF
0528 kanntigai ui_ux
PDF
見やすいプレゼン資料の作り方 - リニューアル増量版
PDF
しょぼいプレゼンをパワポのせいにするな! by @jessedee
PDF
ビジネスマン必見!キレイな提案書を作るためのデザインの基礎知識
PDF
どうしてプレゼン研究会を始めたのか
PDF
社内勉強会を継続成長させる方法
PDF
SINAP TALK Vol.04「プレゼンテーションについて」鷹野雅弘
PDF
【プレゼン】見やすいプレゼン資料の作り方【初心者用】
PPT
色彩センスのいらない配色講座
PDF
Chrome Extensionで効率アップ
PDF
Instagram インスタグラムセミナー講座資料 使い方
PPTX
Go x Slack API
スマホフロントエンド最速化手法
ワクワク電子工作
非エンジニア向けHTML勉強会その1
アプリデザインのお勉強 UI/UXのお話
ほんわかSwift勉強資料
0528 kanntigai ui_ux
見やすいプレゼン資料の作り方 - リニューアル増量版
しょぼいプレゼンをパワポのせいにするな! by @jessedee
ビジネスマン必見!キレイな提案書を作るためのデザインの基礎知識
どうしてプレゼン研究会を始めたのか
社内勉強会を継続成長させる方法
SINAP TALK Vol.04「プレゼンテーションについて」鷹野雅弘
【プレゼン】見やすいプレゼン資料の作り方【初心者用】
色彩センスのいらない配色講座
Chrome Extensionで効率アップ
Instagram インスタグラムセミナー講座資料 使い方
Go x Slack API
Ad

Similar to 今さらながらRSpecに入門してみた (20)

PPTX
R spec勉強会
PPT
PDF
地獄Spec
PDF
地獄Spec
PDF
RSpecによるRailsテスト入門 第六章 高度なコントローラスペック
PDF
Haikara
PDF
RSpec と Cucumber
PPT
Ruby on Rails3 Tutorial Chapter3
ODP
RSpecのここがすごい!
PPT
Kubo100903
PDF
20110820 metaprogramming
PDF
Ruby on Railsではじめるrspecテスト
PDF
こんな辛いテストはいやだ
PDF
Randomly Failing Specs
PDF
「RSpec初心者に送るRSpec最強チュートリアル」発表資料 #sg_study
ODP
Rails-Plugin Flexturesの紹介
PPTX
ライトニングトーク資料 OSC東京2017秋
PPT
Ruby on Rails Tutorial Chapter8-10
ODP
Fabrication
R spec勉強会
地獄Spec
地獄Spec
RSpecによるRailsテスト入門 第六章 高度なコントローラスペック
Haikara
RSpec と Cucumber
Ruby on Rails3 Tutorial Chapter3
RSpecのここがすごい!
Kubo100903
20110820 metaprogramming
Ruby on Railsではじめるrspecテスト
こんな辛いテストはいやだ
Randomly Failing Specs
「RSpec初心者に送るRSpec最強チュートリアル」発表資料 #sg_study
Rails-Plugin Flexturesの紹介
ライトニングトーク資料 OSC東京2017秋
Ruby on Rails Tutorial Chapter8-10
Fabrication
Ad

More from zaru sakuraba (11)

PDF
WebAssembly と Rust の入口の向かいにある道路のベンチに腰掛けるレベルのさわってみた感想を共有
PDF
Goでこれどうやるの? 入門
PDF
CarrierWaveにちょっと互換あるGCP Storage対応クラス
PDF
パフォーマンス計測Ciサービスを作って得た知見を共有したい
PDF
普通のRailsアプリをdockerで本番運用する知見
PDF
スクラム導入に向けて:スクラムは救世主となるのか?
PDF
GitHub Appsの作り方
PDF
Railsモデル設計ケーススタディ
PPTX
社内ネットワーク改善の過程で分かった物理ゆえの闇と脆弱性そしてネットワークの基礎入門
PDF
Service workerとwebプッシュ通知
PPTX
良いプログラマーとは
WebAssembly と Rust の入口の向かいにある道路のベンチに腰掛けるレベルのさわってみた感想を共有
Goでこれどうやるの? 入門
CarrierWaveにちょっと互換あるGCP Storage対応クラス
パフォーマンス計測Ciサービスを作って得た知見を共有したい
普通のRailsアプリをdockerで本番運用する知見
スクラム導入に向けて:スクラムは救世主となるのか?
GitHub Appsの作り方
Railsモデル設計ケーススタディ
社内ネットワーク改善の過程で分かった物理ゆえの闇と脆弱性そしてネットワークの基礎入門
Service workerとwebプッシュ通知
良いプログラマーとは

Recently uploaded (12)

PDF
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
PPTX
Vibe Codingを触って感じた現実について.pptx .
PDF
20250823_IoTLT_vol126_kitazaki_v1___.pdf
PDF
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
PPTX
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
PDF
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
PDF
Working as an OSS Developer at Ruby Association Activity Report 2025
PPTX
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
PDF
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
PDF
翔泳社 「C++ ゼロからはじめるプログラミング」対応 C++学習教材(三谷純)
PDF
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
Vibe Codingを触って感じた現実について.pptx .
20250823_IoTLT_vol126_kitazaki_v1___.pdf
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
Working as an OSS Developer at Ruby Association Activity Report 2025
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
翔泳社 「C++ ゼロからはじめるプログラミング」対応 C++学習教材(三谷純)
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ

今さらながらRSpecに入門してみた